__slots__ 的用法

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 的赋值一般是不可变的元组对象 ,如上例。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容