首先了解一下什么是__slots__
引用来自廖雪峰老师的语句
正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义class:
class Student(object):
pass
然后,尝试给实例绑定一个属性:
s = Student()
s.name = ‘Michael’ # 动态给实例绑定一个属性
print(s.name)
Michael
使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:
实际验证一下子类与父类共用的__slots__
class Student(object):
__slots__=('name','age')
s=Student()
s.name='ming'
s.age=19
print(s.name,s.age)
结果是
ming 19
class Classmate(Student):
__slots__=('score')
s1=Classmate()
s1.name='zhao'
s1.score=99
print(s1.name,s1.score)
结果是zhao 99
如果子类不加上__slots__,直接用pass,会发现s1无论增加什么属性值都可以,并不会被父类的__slots__限制。但是加上__slots__后,就只能在子类和父类的__slots__中增加属性值了
例如此时
s1.height=145
print(s1.height)
就会提示出错,因为height并不在子类和父类的__slots__中