大家都知道,类创建实例的时候,可以给这个实例添加属性,而__slots__的作用就是限制我们能添加哪些属性,写一个简单的例子。
class Student(object):
__slots__=('name','age')
s=Student()
s.name='MR.xu'
s.age=22
s.core=30
运行结果 我们会得到一个错误:AttributeError: 'Student' object has no attribute 'score'提示我们没有score这个属性,结果就是,name是age这两个属性被添加了,而score被拒绝
这个时候我们再创建一个Student的子类 Student2
class Student2(Student):
pass
s2=Student2()
s2.name='MR.lee'
s2.score=100
s2.age=22
print(s2.name,s2.age,s2.score)
运行结果为
MR.xu 22 100
可以看出,虽然我们继承了Student类,但是并没有继承他的__slots__变量,我们可以给Student2的实例添加任何属性,那我们再给Student2定义一个__slots__变量看看
class Student2(Student):
__slots__=('grade')
s2=Student2()
s2.name='MR.xu'
print(s2.name)
s2.age=22
print(s2.age)
s2.score=100
print(s2.score)
s2.grade='大一'
print(s2.grade)
在这里,我们给Student2这个类中添加了__slots__变量值为grade,并给实例s2添加了grade属性
我们来看下分别运行的结果运行结果:
s2.name='MR.xu'
print(s2.name)
MR.xu
---------------------------------
s2.age=22
print(s2.age)
22
---------------------------------
s2.score=100
print(s2.score)
AttributeError: 'Student2' object has no attribute 'score'
---------------------------------
s2.grade='大一'
print(s2.grade)
大一
grade,name,age三个属性都成功添加,唯独score没有,原因就是子类如果定义了__slots__变量,那么他就允许创建自己本身(Student2)的__slots__变量和它的父类(Student)的
__slots__变量。即子类(Student2)的实例(s2)允许创建(‘grade’,'name','age')三个属性