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

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

python 裝飾器的基本使用

瀏覽:103日期:2022-06-30 08:35:06
知識點 簡單的裝飾器 帶有參數的裝飾器 帶有自定義參數的裝飾器 類裝飾器 裝飾器嵌套 @functools.wrap裝飾器使用 基礎使用簡單的裝飾器

def my_decorator(func): def wrapper(): print(’wrapper of decorator’) func() return wrapper()def test(): print(’test done.’)test = my_decorator(test)test輸出:wrapper of decoratortest done.

這段代碼中,變量test指向了內部函數wrapper(), 而內部函數wrapper()中又會調用原函數test(),因此最后調用test()時,就會打印’wrapper of decorator’ 然后輸出 ’test done.’

這里的函數my_decorator()就是一個裝飾器,它把真正需要執(zhí)行的函數test()包裹在其中,并且改變了它的行為,但是原函數test()不變。

上述代碼在Python中更簡單、更優(yōu)雅的表示:

def my_decorator(func): def wrapper(): print(’wrapper of decorator’) func() return wrapper()@my_decoratordef test(): print(’test done.’)test

這里的@, 我們稱為語法糖,@my_decorator就相當于前面的test=my_decorator(test)語句

如果程序中又其他函數需要類似裝飾,只需要加上@decorator就可以,提高函數的重復利用和程序可讀性

帶有參數的裝飾器

def args_decorator(func): def wrapper(*args, **kwargs): print(’wrapper of decorator’) func(*args, **kwargs) return wrapper@args_decoratordef identity(name, message): print(’identity done.’) print(name, message)identity(’changhao’, ’hello’)輸出:wrapper of decoratoridentity done.changhao hello

通常情況下,會把args和*kwargs,作為裝飾器內部函數wrapper()的參數。 表示接受任意數量和類型的參數

帶有自定義參數的裝飾器

定義一個參數,表示裝飾器內部函數被執(zhí)行的次數,可以寫成這個形式:

def repeat(num): def my_decorator(func): def wrapper(*args, **kwargs): for i in range(num):func(*args, **kwargs) return wrapper return my_decorator@repeat(3)def showname(message): print(message)showname(’changhao’)輸出:changhaochanghaochanghao類裝飾器

類也可以作裝飾器,類裝飾器主要依賴于函數 __call__每當調用一個示例時,函數__call__()就會被執(zhí)行一次。

class Count: def __init__(self, func): self.func = func self.num_calls = 0 def __call__(self, *args, **kwargs): self.num_calls += 1 print(’num of calls is: {}’.format(self.num_calls)) return self.func(*args, **kwargs)@Countdef example(): print(’example done.’)example()example()輸出:num of calls is: 1example done.num of calls is: 2example done.

這里定義了類Count,初始化時傳入原函數func(),而__call__()函數表示讓變量num_calls自增1,然后打印,并且調用原函數。因此我們第一次調用函數example()時,num_calls的值是1,而第一次調用時,值變成了2。

裝飾器的嵌套

import functoolsdef my_decorator1(func): @functools.wraps(func) def wrapper(*args, **kwargs): print(’execute decorator1’) func(*args, **kwargs) return wrapperdef my_decorator2(func): @functools.wraps(func) def wrapper(*args, **kwargs): print(’execute decorator2’) func(*args, **kwargs) return wrapper@my_decorator1@my_decorator2def test2(message): print(message)test2(’changhao’)輸出:execute decorator1execute decorator2changhao類裝飾器

類也可以作裝飾器,類裝飾器主要依賴于函數 __call__每當調用一個示例時,函數__call__()就會被執(zhí)行一次。

class Count: def __init__(self, func): self.func = func self.num_calls = 0 def __call__(self, *args, **kwargs): self.num_calls += 1 print(’num of calls is: {}’.format(self.num_calls)) return self.func(*args, **kwargs)@Countdef example(): print(’example done.’)example()example()輸出:num of calls is: 1example done.num of calls is: 2example done.

這里定義了類Count,初始化時傳入原函數func(),而__call__()函數表示讓變量num_calls自增1,然后打印,并且調用原函數。因此我們第一次調用函數example()時,num_calls的值是1,而第一次調用時,值變成了2。

裝飾器的嵌套

import functoolsdef my_decorator1(func): @functools.wraps(func) def wrapper(*args, **kwargs): print(’execute decorator1’) func(*args, **kwargs) return wrapperdef my_decorator2(func): @functools.wraps(func) def wrapper(*args, **kwargs): print(’execute decorator2’) func(*args, **kwargs) return wrapper@my_decorator1@my_decorator2def test2(message): print(message)test2(’changhao’)輸出:execute decorator1execute decorator2changhao@functools.wrap裝飾器使用

import functoolsdef my_decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): print(’wrapper of decorator’) func(*args, **kwargs) return wrapper@my_decoratordef test3(message): print(message)test3.__name__ 輸出test3

通常使用內置的裝飾器@functools.wrap,他會保留原函數的元信息(也就是將原函數的元信息,拷貝到對應的裝飾器里)

裝飾器用法實例身份認證

import functoolsdef authenticate(func): @functools.wraps(func) def wrapper(*args, **kwargs): request = args[0] if check_user_logged_in(request): return func(*args, **kwargs) else: raise Exception(’Authentication failed’) return wrapper@authenticatedef post_comment(request): pass

這段代碼中,定義了裝飾器authenticate;而函數post_comment(),則表示發(fā)表用戶對某篇文章的評論。每次調用這個函數前,都會檢查用戶是否處于登錄狀態(tài),如果是登錄狀態(tài),則允許這項操作;如果沒有登錄,則不允許。

日志記錄

import timeimport functoolsdef log_execution_time(func): @functools.wraps(func) def wrapper(*args, **kwargs): start = time.perf_counter() res = func(*args, **kwargs) end = time.perf_counter() print(’{} took {} ms’.format(func.__name__, (end - start) * 1000)) return wrapper@log_execution_timedef calculate_similarity(times): pass

這里裝飾器log_execution_time記錄某個函數的運行時間,并返回其執(zhí)行結果。如果你想計算任何函數的執(zhí)行時間,在這個函數上方加上@log_execution_time即可。

總結

所謂裝飾器,其實就是通過裝飾器函數,來修改原函數的一些功能,使得原函數不需要修改。

以上就是python 裝飾器的基本使用的詳細內容,更多關于python 裝飾器的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
最新国产精品久久久| 日韩不卡免费视频| 国产一区一一区高清不卡| 久久中文字幕一区二区| 国产精品久久观看| 激情欧美亚洲| 蜜臀久久99精品久久久久久9| 老鸭窝亚洲一区二区三区| 美女被久久久| 亚洲专区视频| 欧美aa在线视频| 日韩精品一区二区三区免费观看| 婷婷综合网站| 日韩国产在线不卡视频| 精品国产成人| 好吊一区二区三区| 国产欧美一区二区三区精品观看| 红杏一区二区三区| 91久久久精品国产| 欧美日本不卡| av免费不卡国产观看| 99国产成+人+综合+亚洲欧美| 日韩激情网站| 香蕉视频亚洲一级| 在线精品观看| 五月天av在线| 亚洲综合激情在线| 福利一区二区免费视频| 国产精品日本| 久久精品资源| 国产精品普通话对白| 免费一区二区三区在线视频| 亚洲二区在线| 久久av影院| 中国女人久久久| 精品网站999| 中文精品电影| 青青久久av| 国产日韩欧美| 欧美在线观看视频一区| 国产乱人伦丫前精品视频 | 尤物网精品视频| 国产精品久久久久久久免费软件 | 天堂久久一区| 亚洲天堂久久| 精品一级视频| 91精品国产自产在线丝袜啪| 999国产精品| 久久永久免费| 亚洲精选av| 激情婷婷综合| 国语精品一区| 国产精品一区2区3区| 丝袜美腿亚洲一区| 秋霞影院一区二区三区| 你懂的国产精品| 日本精品另类| 中文无码日韩欧| 尤物网精品视频| 久久久9色精品国产一区二区三区| 国产精品v一区二区三区| 久热re这里精品视频在线6| 蜜桃精品在线| 精品国产91| 国产女人18毛片水真多18精品| 女人天堂亚洲aⅴ在线观看| 成人在线丰满少妇av| 国产精品视频一区二区三区| 日韩欧美中文字幕电影| 免费视频久久| 红桃视频欧美| 久久久久国产| 日韩欧美一区二区三区在线观看| 精品一区二区三区在线观看视频| 日韩欧美美女在线观看| 视频精品一区二区| 亚洲一区国产一区| 国产91欧美| 国产96在线亚洲| 久久久久久色| 国产精品毛片在线| 尤物精品在线| 激情五月综合网| 蜜桃tv一区二区三区| 日韩在线欧美| 久久精品av| 亚洲欧美日韩高清在线| 欧美不卡高清| 乱人伦精品视频在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 国产免费成人| 综合激情婷婷| 欧美中文一区| 国产亚洲精品美女久久| 久久精品97| 国产精品亚洲综合在线观看| 国产精品国产三级在线观看| 另类欧美日韩国产在线| 国产一区二区视频在线看| 国产aa精品| 亚洲一级高清| 久久亚洲精品伦理| 青青草国产精品亚洲专区无| 国产激情精品一区二区三区| 成人在线超碰| 亚洲二区精品| 亚洲精一区二区三区| 久久黄色影视| 国产999精品在线观看 | 久久国产欧美| 中文国产一区| 日本免费一区二区视频| 久久这里只有| 久久人人97超碰国产公开结果| 精品一区毛片| 亚洲精品在线a| 国产精品免费大片| 在线看片福利| 国产精品美女久久久| 欧美在线精品一区| 捆绑调教日本一区二区三区| 91精品福利| 欧美亚洲一级| 97精品国产| 欧美一区不卡| 91亚洲自偷观看高清| 国产亚洲一区在线| 欧美黑人做爰爽爽爽| 欧美午夜精彩| 日本不卡视频一二三区| 美女视频黄 久久| 亚洲成人三区| 国产精品欧美在线观看| 伊人精品一区| 国产精品毛片久久久| 免费av一区| 国产日韩视频| 亚洲二区视频| 国产极品模特精品一二| 天堂√8在线中文| 亚洲69av| 亚洲欧洲高清| 日韩国产在线观看一区| 亚洲四虎影院| 久久黄色影视| 黄色成人91| 国产一区调教| 亚洲欧美日本国产| 欧美好骚综合网| 日韩精品亚洲专区在线观看| 久久久久久久久99精品大| 日韩国产91| 美女毛片一区二区三区四区| 国产日韩欧美一区在线| 久久久天天操| 欧美国产极品| 天堂久久一区| 中文欧美日韩| 日韩国产专区| 国产精品麻豆成人av电影艾秋| 亚洲激情二区| av最新在线| 国产乱论精品| 自拍自偷一区二区三区| 激情欧美丁香| 中文字幕在线看片| 国产精品成人3p一区二区三区| 国产一区91| 日韩一区二区三区在线免费观看| 麻豆亚洲精品| 国户精品久久久久久久久久久不卡| 国产福利一区二区三区在线播放| 亚洲欧美日韩综合国产aⅴ| 日韩大片在线观看| 精品国产鲁一鲁****| 国产欧美视频在线| 中文字幕成人| 亚洲欧美日韩国产一区| 久久久久午夜电影| 日本激情一区| 久久97久久97精品免视看秋霞| 日韩高清二区| 亚洲精品一二三**| 玖玖玖国产精品| 新版的欧美在线视频| 国产一区国产二区国产三区 | 久久电影一区| 91国语精品自产拍| 亚洲午夜黄色| 99精品视频在线| 日本午夜大片a在线观看| 欧美激情麻豆| 免费亚洲一区| 麻豆精品少妇| 久久亚洲黄色| 精品久久中文| 精品视频亚洲| 四虎成人av| 国产不卡精品| 日韩免费小视频|