日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

Python如何將裝飾器定義為類

瀏覽:19日期:2022-07-15 18:32:49

問題

你想使用一個裝飾器去包裝函數,但是希望返回一個可調用的實例。 你需要讓你的裝飾器可以同時工作在類定義的內部和外部。

解決方案

為了將裝飾器定義成一個實例,你需要確保它實現了 __call__() 和 __get__() 方法。 例如,下面的代碼定義了一個類,它在其他函數上放置一個簡單的記錄層:

import typesfrom functools import wrapsclass Profiled: def __init__(self, func): wraps(func)(self) self.ncalls = 0 def __call__(self, *args, **kwargs): self.ncalls += 1 return self.__wrapped__(*args, **kwargs) def __get__(self, instance, cls): if instance is None: return self else: return types.MethodType(self, instance)

你可以將它當做一個普通的裝飾器來使用,在類里面或外面都可以:

@Profileddef add(x, y): return x + yclass Spam: @Profiled def bar(self, x): print(self, x)

在交互環境中的使用示例:

>>> add(2, 3)5>>> add(4, 5)9>>> add.ncalls2>>> s = Spam()>>> s.bar(1)<__main__.Spam object at 0x10069e9d0> 1>>> s.bar(2)<__main__.Spam object at 0x10069e9d0> 2>>> s.bar(3)<__main__.Spam object at 0x10069e9d0> 3>>> Spam.bar.ncalls3

討論

將裝飾器定義成類通常是很簡單的。但是這里還是有一些細節需要解釋下,特別是當你想將它作用在實例方法上的時候。

首先,使用 functools.wraps() 函數的作用跟之前還是一樣,將被包裝函數的元信息復制到可調用實例中去。

其次,通常很容易會忽視上面的 __get__() 方法。如果你忽略它,保持其他代碼不變再次運行, 你會發現當你去調用被裝飾實例方法時出現很奇怪的問題。例如:

>>> s = Spam()>>> s.bar(3)Traceback (most recent call last):...TypeError: bar() missing 1 required positional argument: ’x’

出錯原因是當方法函數在一個類中被查找時,它們的 __get__() 方法依據描述器協議被調用, 在8.9小節已經講述過描述器協議了。在這里,__get__() 的目的是創建一個綁定方法對象 (最終會給這個方法傳遞self參數)。下面是一個例子來演示底層原理:

>>> s = Spam()>>> def grok(self, x):... pass...>>> grok.__get__(s, Spam)<bound method Spam.grok of <__main__.Spam object at 0x100671e90>>>>>

__get__() 方法是為了確保綁定方法對象能被正確的創建。 type.MethodType() 手動創建一個綁定方法來使用。只有當實例被使用的時候綁定方法才會被創建。 如果這個方法是在類上面來訪問, 那么 __get__() 中的instance參數會被設置成None并直接返回 Profiled 實例本身。 這樣的話我們就可以提取它的 ncalls 屬性了。

如果你想避免一些混亂,也可以考慮另外一個使用閉包和 nonlocal 變量實現的裝飾器,這個在9.5小節有講到。例如:

import typesfrom functools import wrapsdef profiled(func): ncalls = 0 @wraps(func) def wrapper(*args, **kwargs): nonlocal ncalls ncalls += 1 return func(*args, **kwargs) wrapper.ncalls = lambda: ncalls return wrapper# Example@profileddef add(x, y): return x + y

這個方式跟之前的效果幾乎一樣,除了對于 ncalls 的訪問現在是通過一個被綁定為屬性的函數來實現,例如:

>>> add(2, 3)5>>> add(4, 5)9>>> add.ncalls()2>>>

以上就是Python如何將裝飾器定義為類的詳細內容,更多關于Python將裝飾器定義為類的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品久久亚洲| 成人三级高清视频在线看| 久久中文欧美| 日本欧美韩国一区三区| 亚洲精品免费观看| 亚洲免费激情| 国产精品日本| 日本强好片久久久久久aaa| 国产伦精品一区二区三区在线播放| 91成人网在线观看| 91精品精品| 欧美资源在线| 亚洲精品乱码日韩| 久久中文字幕一区二区三区| 国产精品15p| 国产精品nxnn| 国产日韩综合| 精品日产乱码久久久久久仙踪林| 日韩一区电影| 免费国产自线拍一欧美视频| 日本一区免费网站| 成人一区而且| 男女精品网站| 日韩av专区| 蜜臀精品一区二区三区在线观看 | 亚洲一区二区免费看| 国产日本久久| 国产精品毛片久久| 免费在线观看精品| 97国产精品| 91久久精品无嫩草影院| 999久久久亚洲| 日本欧美久久久久免费播放网| 中文字幕在线高清| 久久国际精品| 在线观看亚洲精品福利片| 国产精品中文字幕制服诱惑| 国产婷婷精品| 国产在线不卡一区二区三区| 欧美日韩亚洲一区三区| 亚洲天堂一区二区| 精品国产中文字幕第一页| 亚洲欧美网站在线观看| 伊人久久亚洲影院| 激情综合五月| 精品国产乱码久久久久久樱花| 亚洲专区视频| 美国欧美日韩国产在线播放| 亚洲婷婷在线| 亚洲欧洲高清| 久久亚洲道色| 国产精品**亚洲精品| 欧美精品一区二区三区精品| 国产综合精品一区| 一本大道色婷婷在线| 在线免费观看亚洲| 日本一区二区免费高清| 欧美激情网址| 精品视频在线观看网站| 久久永久免费| 久久免费精品| 日韩av有码| 热三久草你在线| 久久高清免费观看| 亚洲狼人精品一区二区三区| 在线精品一区二区| 日韩三级视频| 精品视频一二| 欧美日韩在线播放视频| 在线成人直播| 精品中文字幕一区二区三区av| 群体交乱之放荡娇妻一区二区| 四虎884aa成人精品最新| 久久一级电影| 国产精品91一区二区三区| 快she精品国产999| 亚洲另类视频| 国产极品嫩模在线观看91精品| 欧美成人精品一级| 精品一区在线| 国产精品久久久久久久久免费高清 | 国产色噜噜噜91在线精品| 亚洲va久久久噜噜噜久久| 国产乱码精品一区二区三区亚洲人 | 精品少妇一区| 欧美 日韩 国产一区二区在线视频 | 久久不见久久见免费视频7| 色在线视频观看| 不卡一区综合视频| **爰片久久毛片| 欧美成人a交片免费看| 2023国产精品久久久精品双| 国产精品欧美三级在线观看| 日韩免费av| 精品中文在线| 亚洲最新av| 国产一区二区三区四区大秀| 日韩在线电影| 亚洲午夜一级| 日本天堂一区| 国产精品普通话对白| 国产精品网站在线看| 黄色不卡一区| 日韩av免费大片| 青草av.久久免费一区| 成人va天堂| 中文一区一区三区免费在线观 | 91精品日本| 蜜桃成人精品| 国产情侣一区在线| 午夜亚洲精品| 成人片免费看| 欧美激情视频一区二区三区免费 | 国产精品白丝久久av网站| 亚洲激情不卡| 久久不见久久见国语| 99香蕉国产精品偷在线观看 | 日本欧美一区| 日韩亚洲在线| 午夜久久免费观看| 三上亚洲一区二区| 国产一区一一区高清不卡| 一区二区国产精品| 久久国产成人| 日韩国产专区| 日韩精品网站| 日韩综合在线| 精品国产亚洲日本| 国产一区二区三区天码| 国产精品国码视频| 日本aⅴ精品一区二区三区| 免费视频一区二区| 美女国产一区| 青青草精品视频| 9国产精品视频| 蘑菇福利视频一区播放| 久久亚洲图片| 国产一区二区三区国产精品| 高潮久久久久久久久久久久久久| 欧美aa在线视频| 国产一区日韩| 欧美~级网站不卡| 久久av在线| 91av一区| 日本在线高清| 国产精品女主播一区二区三区| 黄色欧美日韩| 日韩午夜视频在线| 国产a亚洲精品| 精品久久网站| 丝袜美腿一区二区三区| 久久国内精品| 伊人久久高清| 视频在线观看一区| 91精品视频一区二区| 在线天堂资源www在线污| 欧美日韩黑人| 日韩精品一级中文字幕精品视频免费观看| 青草国产精品| 日韩免费在线| 一区二区亚洲视频| 精品视频免费| jiujiure精品视频播放| 在线精品福利| 国产日韩三级| 久久亚洲风情| 国产精品2023| 视频一区欧美日韩| 国产福利亚洲| 亚洲乱码一区| 国产一区二区久久久久| 久久精品国产www456c0m| 亚洲永久精品唐人导航网址| 国产在线不卡一区二区三区| 亚洲综合另类| 黄色在线网站噜噜噜| 日韩国产欧美在线视频| 久久精品卡一| 亚洲伦乱视频| 日韩激情中文字幕| 五月天久久久| 国产婷婷精品| 日本精品影院| 久久久免费人体| 日本亚洲欧洲无免费码在线| 亚洲午夜黄色| 日韩高清中文字幕一区二区| 麻豆国产欧美日韩综合精品二区| 中文字幕一区二区精品区| 狠狠爱www人成狠狠爱综合网| 国产在线观看www| 国产毛片精品久久| 日韩精品欧美大片| 热久久国产精品| 日韩国产一区二区| 精品深夜福利视频| 麻豆成人综合网| 国产精品永久| 欧美私人啪啪vps| 久久激情综合网|