您好,登錄后才能下訂單哦!
這篇文章主要講解了“python魔法方法 __ slots __怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“python魔法方法 __ slots __怎么使用”吧!
__slots__
是python class的一個特殊attribute,能夠節省內存空間。正常情況下,一個類的屬性是以字典的形式來管理, 每個類都會有__ dict__
方法。但是我們可以通過 設置 __ slots__
來將類的屬性構造成一個靜態的數據結構來管理,里面存儲的是 value references。
class Bar(object): def __init__(self, a): self.a = a class BarSlotted(object): __slots__ = "a", def __init__(self, a): self.a = a # create class instance bar = Bar(1) bar_slotted = BarSlotted(1) print(set(dir(bar)) - set(dir(bar_slotted))) # {'__dict__', '__weakref__'} ''' 使用 __slots__ 后, 類里面會減少 __dict__ __weakref__ 兩個方法。 __weakref__ --- 弱引用 詳情鏈接 https://docs.python.org/zh-cn/3/library/weakref.html '''
優點:
節約內存,不用去定義動態數據接口 __ dict__
的內存, __ weakref__
也不用去申請
access attributes 更快,靜態數據結構,比__ dict__
更快
缺點:
定義死后,不能去申請新的屬性,申請會報屬性錯誤
可以通過 把 __ dict__
作為 __ slots__
的一個屬性,實現既能通過定義__ slots__
節約內存,又實現新屬性的定義。
class BarSlotted(object): __slots__ = "a",'__dict__' def __init__(self, a): self.a = a bar_slotted = BarSlotted(1) bar_slotted.b = "111"
當你事先知道class的attributes的時候,建議使用slots來節省memory以及獲得更快的attribute access。
注意不應當用來限制__slots__
之外的新屬性作為使用__slots__
的原因,可以使用裝飾器以及反射的方式來實現屬性控制。
子類會繼承父類的 __ slots__
class Parent(object): __slots__ = "x", "y" class Child(Parent): __slots__ = "z", # 重復的 x, y 可以不寫, # __slots__ = "x", "y", "z" child = Child() print(dir(child)) # [..., 'x', 'y', 'z']
不支持多繼承, 會直接報錯
class ParentA(object): __slots__ = "x", class ParentB(object): __slots__ = "y", class Child(ParentA, ParentB): pass ''' Traceback (most recent call last): File "C:/Users/15284/PycharmProjects/pythonProject/test.py", line 69, in <module> class Child(ParentA, ParentB): TypeError: multiple bases have instance lay-out conflict '''
只允許父類中有一方設定了 __ slots__
class AbstractA(object): __slots__ = () class AbstractB(object): __slots__ = "x" class Child(AbstractA, AbstractB): __slots__ = "x", "y"
新版本的 pickle中的 pickle含有slotted class,使用時需要注意。
感謝各位的閱讀,以上就是“python魔法方法 __ slots __怎么使用”的內容了,經過本文的學習后,相信大家對python魔法方法 __ slots __怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。