__slots__ 的用法

Python代碼如果出現(xiàn)這種 __slots__ 會不會覺得很懵
其實這是一種節(jié)約內存的技術


一般的類內置的事一個屬性字典 __dict__ 可以動態(tài)增加屬性

比如

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屬性是動態(tài)填入的,相當于調用了 setattr(aa, "y", 100)

還可以繼續(xù) setattr(aa, "z", 90) ...

如果在 類A中定一個槽 __slots__ 那么類的對象都不會再生成__dict__ ,屬性被固定,動態(tài)增加屬性也會報錯

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__ ? 需要極致壓縮內存,并且深知,類的屬性是固定,并且不會動態(tài)添加的時候。
使用 __slots__ 會帶來很好的內存優(yōu)化,但是失去了一些靈活性。
當工程中有許多類似的對象創(chuàng)建,通常是上萬上千這種,可以考慮使用__slots__優(yōu)化, __slots 的賦值一般是不可變的元組對象 ,如上例。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容