1.给实例化的对象添加新的属性
看下面一段代码,然后给实例化的对象s添加或者修改属性
class Student(object):
name='china'
s = Student()
s1=Student()
s.name = 'Charles'
s.age=20
print s.name
print s1.name
print s.age
结果:
Charles
china
20
可以看到:实例的属性可以被修改或者添加
2、使用__slots__限制只有指定的属性才可以被实例添加
将可以被实例化的对象修改的属性添加到内置函数__slots__后面的元祖中,表示只有当属性存在于该元祖中时,该属性才可以在对象中被添加,但是不能修改(如果该属性已经存在于类中);
class Student(object):
__slots__=('name','age')
# gender='female'
# name='china'
# age = 30
s = Student()
s1=Student()
s.name = 'Charles'
s.age=20
print s.name
# print s1.name
print s.age
# s.gender='male'
在上述代码中s/s1能够添加的属性只有name和age,但是,如果name或者age已经存在于Student类中,那么就不能再s/s1中添加了,否则会报属性错误;
3、在类的继承中使用__slots__限制实例化对象的属性
创建一个Primary_Student类,继承Student类,然后实例化Primary_Student
class Student(object):
__slots__=('name','age')
class PrimaryStudent(Student):
pass
s2 = PrimaryStudent()
s2.name = 'eric'
s2.genger='male'
print s2.name
print s2.genger
上述代码显示正常
如果我们再在子类中定义__slots__方法呢?
class Student(object):
__slots__=('name','age')
class PrimaryStudent(Student):
__slots__ = ('gender')
s2 = PrimaryStudent()
s2.name = 'eric'
s2.gender='male'
s2.grade=80
print s2.name
print s2.gender
上述代码在执行到s2.grade=80的时候报属性错误
好了,做到这儿,我们就可以总结一下了
1、类的属性(之前有教程叫做字段,只有包含@装饰器property的方法称为属性,这里就统一叫做属性吧),可以被实例化的对象添加新的属性以及修改属性的值;
2、可以使用__slots__方法,实现只有属性存在于该方法后面的元祖中的时候,在可以被对象添加,如果字段不存在于元祖中,那么该属性只能被对象访问;
3、如果在父类中存在__slots__方法,父类中__slots__对属性的限制不会继承到子类中,但是如果子类中也定义了__slots__方法,那么子类的属性的限制就会继承父类的__slots__,并加上子类的__slots__;
参考地址:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186739713011a09b63dcbd42cc87f907a778b3ac73000