一、 __slots__作用
首先看一段代码
class People(object):
def __init__(self):
pass
if __name__ == '__main__':
a = People()
a.score = 90 # 动态设置对象属性
print(a.score)
python中可以为对象动态设置属性,但是如果想限定可以动态设置的属性,可以使用__slots__,比如限制People的实例对象只可以设置name、age属性。
class People(object):
__slots__ = ('name', 'age')
def __init__(self):
pass
if __name__ == '__main__':
a = People()
a.score = 90 # 动态设置对象属性
print(a.score)
再次运行代码,报错
Traceback (most recent call last):
File "/Users/.../Desktop/flaskr/slots_desc.py", line 14, in <module>
a.score = 90 # 动态设置对象属性
AttributeError: 'People' object has no attribute 'score'
使用__slots__之后只能为对象设置name,age属性。
二、 __slots__继承
1、 子类未定义__slots__,子类不继承父类的__slots__
class Engineer(People):
pass
if __name__ == '__main__':
e = Engineer()
e.score = 90
print(e.score) # 输出为90
2、子类定义__slots__则继承父类的__slots__
class Engineer(People):
__slots__ = ('job',)
pass
if __name__ == '__main__':
e = Engineer()
e.name = 'tester'
e.job = 'tester'
print(e.name, e.job) # 输出两个tester
三、__slots__优化内存
类中定义__slots__会提前分配好属性空间,而不会去使用__dict__,可以达到优化内存的效果,相应带来的问题为维护成本提高,所以一般在能确定类属性的情况下使用。