中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Python3中類屬性slots的常見疑問以及解答示例-創(chuàng)新互聯(lián)

小編給大家分享一下Python3中類屬性slots的常見疑問以及解答示例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)公司專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、建華網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城網(wǎng)站制作、集團公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為建華等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

1.為什么 __slots__ 可以節(jié)省內(nèi)存,提高速度的?

2.咋通過 __slots__ 來實現(xiàn)屬性的存儲與訪問的?

3.使用了 __slots__ 的類怎么實現(xiàn)動態(tài)賦值,如果需要實例弱引用支持怎么搞?

4.使用了 __slots__ 的類繼承與被繼承時的表現(xiàn)?

針對這幾個問題作答:

 1. 通常情況下,類實例使用 __dict__來存儲其屬性數(shù)據(jù),好處是允許我們在運行時動態(tài)的設(shè)置實例屬性,然而 dict 哈希表本身的數(shù)據(jù)結(jié)構(gòu)決定了它需要更多的內(nèi)存,當(dāng)創(chuàng)建的實例越多,或者實例的屬性越多時,內(nèi)存的耗費將更加嚴(yán)重。__slots__ 保證了解釋器在編譯時期就知道這個類具有什么屬性,以分配固定的空間來存儲已知的屬性。

 2.使用 __slots__ 時,會將屬性的存儲從實例的 __dict__ 改為類的 __dict__ 中:

>>> Y.__dict__
mappingproxy({'__module__': '__main__',
              '__slots__': ('a', 'b'),
              '__init__': <function __main__.Y.__init__(self, a, b)>,
              'a': <member 'a' of 'Y' objects>,
              'b': <member 'b' of 'Y' objects>,
              '__doc__': None})

屬性的訪問是通過在類層級上為每個 slot 變量創(chuàng)建和 實現(xiàn)描述器(descriptor) 實現(xiàn)的,該描述器知道屬性值在實例列表中的位置。關(guān)于描述器與屬性的訪問在我的 走進 Python 類的內(nèi)部 一文中均有詳細(xì)的解釋,感興趣的同學(xué)可前去閱讀。另外,這篇 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
<weakref at 0x107d17d68; to 'Y' at 0x107a4d480>

4.當(dāng)類繼承自一個未定義 __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'

以上是Python3中類屬性slots的常見疑問以及解答示例的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

新聞名稱:Python3中類屬性slots的常見疑問以及解答示例-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://www.rwnh.cn/article4/doscoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)頁設(shè)計公司外貿(mào)網(wǎng)站建設(shè)、面包屑導(dǎo)航、用戶體驗云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
浮梁县| 克什克腾旗| 迁安市| 蓝田县| 鹤峰县| 揭阳市| 黄陵县| 铜川市| 屏边| 景宁| 连山| 正蓝旗| 都昌县| 广东省| 琼海市| 天峨县| 南京市| 宣化县| 沂水县| 承德县| 元朗区| 甘孜| 曲麻莱县| 锡林浩特市| 积石山| 银川市| 疏勒县| 嘉荫县| 开原市| 桂林市| 丰顺县| 房产| 凌海市| 镇康县| 南昌市| 黎城县| 杨浦区| 商洛市| 剑河县| 柞水县| 武定县|