python的slots

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'