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

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:105日期: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__ # 這個方法應該是這個緩存裝飾器的關鍵 # 因此, 我組織關鍵字如下 # * 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:

根據memoized_property的實現方法,下面的答案都有一個前提,即假設其作為對類函數的裝飾器來使用。此時這個類可以看作是property裝飾器的修改版。能夠實現緩存的效果是因為Python訪問屬性時是有優先級的。

對于a.val,Python進行如下處理:

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

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

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

對于這里的memoized_property來說:

比如這個類封裝了A類的val函數:

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

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

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

而__get__的內部,又能說好多了。。。。

回答2:

類方法就是當你不用做類的實例化就可以直接調用的方法

標簽: Python 編程
相關文章:
主站蜘蛛池模板: bunker国产videos | 五月天婷婷综合 | 国产成人精品视频 | 亚洲日韩色综合视频 | 国内精品久久久久久久久久久久 | 午夜精品在线观看 | 极品丝袜高跟91极品系列 | 欧美一二区视频 | 国产免费久久精品99久久 | 国产成人在线视频网站 | 国产精品免费大片一区二区 | 欧美一区二区三区在线观看 | 九九热精品国产 | 中文字幕第一页在线播放 | 国产精品久久久久久久久免费 | 激情免费网站 | 911精品国产91久久久久 | 欧美整片第一页 | 黄色成人在线网站 | 日韩精品a在线视频 | 亚洲欧美一区二区三区二厂 | 青草视频免费在线观看 | 性情视频在线高清免费 | 国内精自线一二区 | 久久青草免费免费91线频观看 | 永久免费毛片 | 大杳蕉精品视频在线观看 | 国产精品久久影院 | 精品视频在线播放 | 国产免费叼嘿视频 | 中国日韩欧美中文日韩欧美色 | 校园春色国产精品 | 国产亚洲精品综合在线网址 | 伊人网综合在线 | 国产视频自拍一区 | 国产乱码精品一区二区三区网页版 | 精品视频在线免费 | 国产亚洲综合色就色 | www.99色.com| 伊人久久大香线蕉精品哪里 | 一级女人18毛片免费 |