日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Python教程:Python3中類屬性slots的常見疑問有哪些?

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

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供赫山網(wǎng)站建設(shè)、赫山做網(wǎng)站、赫山網(wǎng)站設(shè)計(jì)、赫山網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、赫山企業(yè)網(wǎng)站模板建站服務(wù),十余年赫山做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。


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

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

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

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

針對(duì)這幾個(gè)問題作答:

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

 2.使用 __slots__ 時(shí),會(huì)將屬性的存儲(chǔ)從實(shí)例的 __dict__ 改為類的 __dict__ 中:

>>> Y.__dict__
mappingproxy({'__module__': '__main__',
              '__slots__': ('a', 'b'),
              '__init__': ,
              'a': ,
              'b': ,
              '__doc__': None})

屬性的訪問是通過在類層級(jí)上為每個(gè) slot 變量創(chuàng)建和 實(shí)現(xiàn)描述器(descriptor) 實(shí)現(xiàn)的,該描述器知道屬性值在實(shí)例列表中的唯一位置。關(guān)于描述器與屬性的訪問在我的 走進(jìn) Python 類的內(nèi)部 一文中均有詳細(xì)的解釋,感興趣的同學(xué)可前去閱讀。另外,這篇 how __slots__ are implemented 也許可以幫助你的理解,盡管我看它寫于很多年前,但至今依然有借鑒意義。

 3.怎么實(shí)現(xiàn)動(dòng)態(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.當(dāng)類繼承自一個(gè)未定義 __slots__ 的類時(shí),實(shí)例的 __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__ 在其子類中同樣可用。不過,子類將會(huì)獲得 __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'

看來想要成功給電腦釋放內(nèi)存并不是一件容易的事情,這些常見的slots疑問點(diǎn)大家一定要牢記哦~更多Python學(xué)習(xí)推薦:PyThon學(xué)習(xí)網(wǎng)教學(xué)中心。


名稱欄目:創(chuàng)新互聯(lián)Python教程:Python3中類屬性slots的常見疑問有哪些?
標(biāo)題鏈接:http://www.5511xx.com/article/ccddgsj.html