8.4 创建大量对象时节省内存方法:
你的程序要创建大量(可能上百万)的对象,导致占用很大的内存;
对于主要是用来当成简单的数据结构的类而言,你可以通过给类添加__slots__属性来极大的减少实例
所占的内存:
当你定义 __slots__ 后,Python就会为实例使用一种更加紧凑的内部表示。 实例通过一
个很小的固定大小的数组来构建,而不是为每个实例定义一个字典,这跟元组或列表很类
似。 在 __slots__ 中列出的属性名在内部被映射到这个数组的指定小标上。 使用slots一
个不好的地方就是我们不能再给实例添加新的属性了,只能使用在 __slots__ 中定义的那
些属性名
class Date(object):
__slots__ = ['year','month','day']
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
s=Date('a','b','c')
print s
print type(s)
# s.address='aa'
# print s.address
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/cookbook/a25.py
<__main__.Date object at 0x026AF968>
<class '__main__.Date'>
Process finished with exit code 0
class Date(object):
__slots__ = ['year','month','day']
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
s=Date('a','b','c')
print s
print type(s)
s.address='aa'
print s.address
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/cookbook/a25.py
Traceback (most recent call last):
<__main__.Date object at 0x0255F940>
File "C:/Users/TLCB/PycharmProjects/untitled/mycompany/cookbook/a25.py", line 10, in <module>
s.address='aa'
<class '__main__.Date'>
AttributeError: 'Date' object has no attribute 'address'
Process finished with exit code 1
关于 __slots__ 的一个常见误区是它可以作为一个封装工具来防止用户给实例增加新的属
性。 尽管使用slots可以达到这样的目的,但是这个并不是它的初衷。 __slots__ 更多的
是用来作为一个内存优化工具。