Python代码如果出现这种 __slots__ 会不会觉得很懵
其实这是一种节约内存的技术
一般的类内置的事一个属性字典 __dict__ 可以动态增加属性
比如
class A:
def __init__(self, x):
self.x = x
a = A(1)
a.x = 100 # x被设置为100
a.y = 6 # 啊?没有y 会怎么样?
没有什么问题 ,a有了两个属性 x, y; y属性是动态填入的,相当于调用了 setattr(aa, "y", 100)
还可以继续 setattr(aa, "z", 90) ...
如果在 类A中定一个槽 __slots__ 那么类的对象都不会再生成__dict__ ,属性被固定,动态增加属性也会报错
class A:
__slots__ = ("x", ) # 固定槽,只有一个属性
def __init__(self, x):
self.x = x
Traceback (most recent call last):
File "/Users/michealss/PycharmProjects/trygeek/plugin.py", line 111, in <module>
setattr(aa, "y", 90)
AttributeError: 'A' object has no attribute 'y'
如果集成A,必须显示写 __slots__ 否则会被 __dict__ 覆盖掉。
什么时候要使用显式的 __slots__ ? 需要极致压缩内存,并且深知,类的属性是固定,并且不会动态添加的时候。
使用 __slots__ 会带来很好的内存优化,但是失去了一些灵活性。
当工程中有许多类似的对象创建,通常是上万上千这种,可以考虑使用__slots__优化, __slots 的赋值一般是不可变的元组对象 ,如上例。