色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

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

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

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

問題描述

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__ # 這個方法應(yīng)該是這個緩存裝飾器的關(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)

問題解答

回答1:

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

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

先訪問對象的__dict__,即a.__dict__[’val’];

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

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

對于這里的memoized_property來說:

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

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

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

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

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

回答2:

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

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 亚洲欧美日产综合在线看 | 亚洲国产成人私人影院 | 欧美国产精品不卡在线观看 | 精品欧美一区二区在线观看欧美熟 | 韩国毛片在线观看 | 成年人在线网站 | 一级a毛片免费 | 国产成人午夜精品影院游乐网 | 一级女性全黄久久生活片免费 | 欧美日韩日本国产 | 91精品网站 | 777444欧美影视| 色屁屁一区二区三区视频国产 | 久久最新免费视频 | 欧美经典成人在观看线视频 | 国产一区二区在线播放 | 国产不卡在线播放 | 亚洲影院在线播放 | 日韩中文字幕在线免费观看 | 午夜精品成人毛片 | 伊人热久久 | 亚洲精品综合在线 | 国产区最新 | 国产三级观看 | 毛片免费观看的视频 | 日韩日韩日韩手机看片自拍 | 一区二区三区四区在线 | 在线精品国产成人综合第一页 | 中文字字幕码一二区 | 波多野结衣一区在线观看 | 男女免费观看在线爽爽爽视频 | 欧美午夜免费观看福利片 | 国产三级精品91三级在专区 | 222aaa天堂 | 久久国产国内精品对话对白 | 欧美一级二级毛片视频 | 欧美特级另类xxx | 国产区精品 | 国产在线观看一区二区三区四区 | 男人天堂免费 | 免费观看成年的网站 |