Python 是一门动态语言,可以在运行过程中,修改对象的属性和增删方法。任何类的实例对象包含一个字典__dict__, Python通过这个字典将任意属性绑定到对象上。有时候我们只想使用固定的对象,而不想任意绑定对象,这时候我们可以定义一个属性名称集合,只有在这个集合里的名称才可以绑定。__slots__就是完成这个功能的。
使用__slots__的类的实例不再使用字典来存储数据。相反,会使用基于数组的更加紧凑的数据结构。 在会创建大量对象的程序中,使用__slots__可以显著减少内存占用和使用时间
class test_slots(object):
__slots__ = ("width", "height")
def hello(self):
print 'hello'
class test(object):
def __init__(self, width=10):
self.width = width
def hello(self):
print 'hello'
如下可以看到在test_slots中增加了__slots__,不再使用test中的__dict__属性
a = test_slots()
b = test()
dir(a)
dir(b)
>>>['__class__',
'__delattr__',
'__doc__',
'__slots__',
'height',
'width',
'hello']
>>>['__class__',
'__delattr__',
'__init__',
'__dict__',
'__doc__',
'width',
'hello']
对test对象增加新属性是没问题的,但是对test_slots只能使用width\height两个属性
a.width = 1
a.height = 2
b.width = 1
b.width = 2
b.newatt = 1
a.newatt = 2
>>>Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'test_slots' object has no attribute 'newatt'