亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python, 理解下面這個(gè)裝飾器(based on class), 有哪幾個(gè)關(guān)鍵點(diǎn) ?

瀏覽:78日期:2022-07-31 18:51:37

問(wèn)題描述

class memoized_property(object): '''A read-only @property that is only evaluated once.''' def __init__(self, fget, doc=None):self.fget = fgetself.__doc__ = doc or fget.__doc__self.__name__ = fget.__name__ # 這個(gè)方法應(yīng)該是這個(gè)緩存裝飾器的關(guān)鍵 # 因此, 我組織關(guān)鍵字如下 # * python __get__ # * how python __get__ works # # python descript tools def __get__(self, obj, cls):if obj is None: return selfobj.__dict__[self.__name__] = result = self.fget(obj)return result def _reset(self, obj):memoized_property.reset(obj, self.__name__) @classmethod def reset(cls, obj, name):obj.__dict__.pop(name, None)

問(wèn)題解答

回答1:

根據(jù)memoized_property的實(shí)現(xiàn)方法,下面的答案都有一個(gè)前提,即假設(shè)其作為對(duì)類函數(shù)的裝飾器來(lái)使用。此時(shí)這個(gè)類可以看作是property裝飾器的修改版。能夠?qū)崿F(xiàn)緩存的效果是因?yàn)镻ython訪問(wèn)屬性時(shí)是有優(yōu)先級(jí)的

對(duì)于a.val,Python進(jìn)行如下處理:

先訪問(wèn)對(duì)象的__dict__,即a.__dict__[’val’];

如果沒(méi)有再訪問(wèn)類的A.__dict__[’val’],此時(shí)會(huì)沿著繼承關(guān)系一直向上尋找;

如果找到A.__dict__[’val’],返回的是值的話,那么就獲得該值;如果返回的是一個(gè)描述器,則會(huì)調(diào)用描述器的__get__方法;

對(duì)于這里的memoized_property來(lái)說(shuō):

比如這個(gè)類封裝了A類的val函數(shù):

class A(object): ...@memoized_property def val(self):...a = A()a.val

在第一次訪問(wèn)val的時(shí)候,根據(jù)上面的查找順序:對(duì)象里面沒(méi)有,跳到第二步;在類的字典里發(fā)現(xiàn)了,但發(fā)現(xiàn)是描述器,因此會(huì)進(jìn)入到描述器中的__get__方法中。在這里,使用self.fget(obj)調(diào)用裝飾的val函數(shù)并計(jì)算結(jié)果后,在返回結(jié)果的同時(shí),將結(jié)果也存儲(chǔ)在obj.__dict__[’val’]中。下次再訪問(wèn)a.val的時(shí)候,由于對(duì)象的__dict__中有val了,就會(huì)先查找obj.__dict__[’val’],而不會(huì)大動(dòng)干戈的去找__get__。這樣就實(shí)現(xiàn)緩存一個(gè)屬性的效果。而一般的__get__是不會(huì)設(shè)置obj.__dict__[’xxx’]的,所以每次都是重新計(jì)算。

明白了這些以后,reset就很清楚了,只不過(guò)把上一個(gè)優(yōu)先級(jí)的途徑去掉。然后Python就不得不沿著優(yōu)先級(jí)一步步找下去,發(fā)現(xiàn)__get__可用,于是又在其中調(diào)用a.val方法重新計(jì)算了一遍。

而__get__的內(nèi)部,又能說(shuō)好多了。。。。

回答2:

類方法就是當(dāng)你不用做類的實(shí)例化就可以直接調(diào)用的方法

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 久久久久无码国产精品一区 | 一区二区三区免费在线视频 | 欧美成人免费毛片 | 91免费视频版 | 成人a毛片免费视频观看 | 国产资源在线看 | 欧美黄色大片免费观看 | 一级黄色免费观看 | 免费观看黄a一级视频 | 日韩在线不卡一区在线观看 | 国产视频观看 | 国产精品国产三级国产专区5o | 揄拍成人国产精品视频 | 欧美日韩视频二区三区 | 国产大尺度吃奶无遮无挡网 | 国产91精品不卡在线 | 黄色一级毛片看一级毛片 | 国产日产欧美一区二区三区 | 黄色aaa毛片 | 一级黄色片一 | 一级特级黄色片 | 亚洲精品二区中文字幕 | 五月天综合婷婷 | 国内一级特黄女人精品毛片 | 巨大巨粗巨长 黑人长吊视频 | 久久国产精品久久国产片 | 亚洲国产日韩在线 | 亚洲永久视频 | 国产一区二区三区四区在线污 | 亚洲美女毛片 | 欧美国产日韩在线播放 | 久久国产亚洲精品麻豆 | 久久国产精品久久 | 久草网免费 | 国产特一级毛片 | 啪啪欧美 | 久久成人国产精品免费 | a级国产乱理论片在线观看ai | 狠狠亚洲婷婷综合色香五 | 国产一区二区三区在线电影 | 夜色www国产精品资源站 |