新聞中心
電腦用的時間久了,內存慢慢的就不夠用,運行起來也會比較卡。與其想著加大電腦的內存,不如換一種思路,如何把電腦的內存釋放出來。python3中的slots就是用來減少內存占用的,不過在使用的時候,小伙伴們知道需要注意哪些方面嗎?小編今天把需要注意的地方都整理了出來,大家一起看看吧。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供赫山網(wǎng)站建設、赫山做網(wǎng)站、赫山網(wǎng)站設計、赫山網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、赫山企業(yè)網(wǎng)站模板建站服務,十余年赫山做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
1.為什么 __slots__ 可以節(jié)省內存,提高速度的?
2.咋通過 __slots__ 來實現(xiàn)屬性的存儲與訪問的?
3.使用了 __slots__ 的類怎么實現(xiàn)動態(tài)賦值,如果需要實例弱引用支持怎么搞?
4.使用了 __slots__ 的類繼承與被繼承時的表現(xiàn)?
針對這幾個問題作答:
1. 通常情況下,類實例使用 __dict__來存儲其屬性數(shù)據(jù),好處是允許我們在運行時動態(tài)的設置實例屬性,然而 dict 哈希表本身的數(shù)據(jù)結構決定了它需要更多的內存,當創(chuàng)建的實例越多,或者實例的屬性越多時,內存的耗費將更加嚴重。__slots__ 保證了解釋器在編譯時期就知道這個類具有什么屬性,以分配固定的空間來存儲已知的屬性。
2.使用 __slots__ 時,會將屬性的存儲從實例的 __dict__ 改為類的 __dict__ 中:
>>> Y.__dict__
mappingproxy({'__module__': '__main__',
'__slots__': ('a', 'b'),
'__init__': ,
'a': ,
'b': ,
'__doc__': None})
屬性的訪問是通過在類層級上為每個 slot 變量創(chuàng)建和 實現(xiàn)描述器(descriptor) 實現(xiàn)的,該描述器知道屬性值在實例列表中的唯一位置。關于描述器與屬性的訪問在我的 走進 Python 類的內部 一文中均有詳細的解釋,感興趣的同學可前去閱讀。另外,這篇 how __slots__ are implemented 也許可以幫助你的理解,盡管我看它寫于很多年前,但至今依然有借鑒意義。
3.怎么實現(xiàn)動態(tài)賦值和弱引用支持?答案是:在 __slots__ 中加上 __dict__ 和 __weakref__。
class Y:
__slots__ = ('a', 'b', '__dict__', '__weakref__')
def __init__(self, a, b):
self.a = a
self.b = b
>>> import weakref
>>> y = Y(7, 8)
>>> y.a
7
>>> y.b
8
>>> y.c = 9
>>> y.__dict__
{'c': 9}
>>> ry = weakref.ref(y)
>>> ry
4.當類繼承自一個未定義 __slots__ 的類時,實例的 __dict__ 和 __weakref__ 屬性將總是可訪問的。
class X:
def __init__(self):
self.a = 7
class Y(X):
__slots__ = ('b', 'c')
def __init__(self):
super().__init__()
self.b = 8
self.c = 9
>>> y = Y()
>>> y.a
7
>>> y.b
8
>>> y.__dict__
{'a': 7}
5.在父類中聲明的 __slots__ 在其子類中同樣可用。不過,子類將會獲得 __dict__ 和 __weakref__,除非它們也定義了 __slots__ 。
class X:
__slots__=('a', 'b')
def __init__(self):
self.a = 7
self.b = 8
class Y(X):
"""沒有定義 __slots__"""
class Z(X):
__slots__ = ()
>>> y = Y()
>>> y.a
7
>>> y.b
8
>>> y.c = 9
>>> y.__dict__
{'c': 9}
>>> z = Z()
>>> z.a
7
>>> z.b
8
>>> z.c = 9
AttributeError: 'Z' object has no attribute 'c'
看來想要成功給電腦釋放內存并不是一件容易的事情,這些常見的slots疑問點大家一定要牢記哦~更多Python學習推薦:PyThon學習網(wǎng)教學中心。
網(wǎng)站名稱:創(chuàng)新互聯(lián)Python教程:Python3中類屬性slots的常見疑問有哪些?
網(wǎng)址分享:http://m.5511xx.com/article/ccddgsj.html


咨詢
建站咨詢
