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

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

python 裝飾器的基本使用

瀏覽:101日期: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()就是一個裝飾器,它把真正需要執行的函數test()包裹在其中,并且改變了它的行為,但是原函數test()不變。

上述代碼在Python中更簡單、更優雅的表示:

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()的參數。 表示接受任意數量和類型的參數

帶有自定義參數的裝飾器

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

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__()就會被執行一次。

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__()就會被執行一次。

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(),則表示發表用戶對某篇文章的評論。每次調用這個函數前,都會檢查用戶是否處于登錄狀態,如果是登錄狀態,則允許這項操作;如果沒有登錄,則不允許。

日志記錄

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記錄某個函數的運行時間,并返回其執行結果。如果你想計算任何函數的執行時間,在這個函數上方加上@log_execution_time即可。

總結

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

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

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆精品av| 欧美午夜三级| 国产精品xx| 国产一区三区在线播放| 精品国产一级| 精品国产不卡| 成人国产精品久久| 久久久久久久久成人| 国产福利资源一区| 国产高清亚洲| 日本欧美国产| 女生影院久久| 国产综合视频| 亚洲天堂黄色| 亚洲激情黄色| 欧美 日韩 国产一区二区在线视频| 伊人久久大香线蕉av不卡| 影音国产精品| 日韩在线黄色| 国产精品欧美日韩一区| 乱一区二区av| а√在线中文在线新版| 欧产日产国产精品视频| 99精品在线观看| 久久国产精品亚洲77777| 亚洲精品乱码| 色婷婷色综合| 欧美影院三区| 四虎国产精品免费久久| 麻豆91精品91久久久的内涵| 欧美黄色一区二区| 亚洲不卡av不卡一区二区| 在线一区欧美| 精品网站aaa| 亚洲激情av| 国产美女亚洲精品7777| av中文字幕在线观看第一页| 尹人成人综合网| 国产精品网站在线看| 成人av三级| 久热精品在线| 麻豆一区在线| 亚洲精品99| 国产日韩欧美在线播放不卡| 亚洲最新无码中文字幕久久| 欧美91福利在线观看| 日韩中文字幕无砖| 都市激情国产精品| 一区二区91| 成人午夜网址| 美女精品在线| 久久影院资源站| 久久先锋影音| 牛牛精品成人免费视频| 美女久久久久| 久久精品99久久久| 久久国产中文字幕| 在线观看视频免费一区二区三区| 精品国产午夜| 蜜桃av一区二区| 麻豆久久久久久久| 国产亚洲永久域名| 久久99久久人婷婷精品综合| 美女网站一区| 国产精品a级| 午夜亚洲一区| 黑人精品一区| 日韩精品午夜视频| 久久久久久久久99精品大| 国产精品一区二区中文字幕| 极品日韩av| 久久免费精品| 亚洲免费中文| 黄色在线网站噜噜噜| 亚洲精品人人| 国产理论在线| 国产欧美日韩一区二区三区四区| 久久久久91| 日韩不卡在线观看日韩不卡视频 | 亚洲精品99| 免费在线欧美黄色| 免播放器亚洲| 日韩专区精品| 国产日韩免费| 视频在线观看一区二区三区| 高清不卡亚洲| 色网在线免费观看| 国产调教精品| 久久国产高清| 精品免费在线| 亚洲精品成人一区| 狠狠干综合网| 久久久精品五月天| 韩国女主播一区二区三区| 深夜福利亚洲| 日本一区二区免费高清| 国产日韩一区二区三免费高清 | 免费精品一区| 日本亚洲欧洲无免费码在线| 香蕉久久国产| 人人香蕉久久| 精品国产乱码久久久久久1区2匹| 日韩高清欧美激情| 日韩影院免费视频| 国产一区91| 黄色av日韩| 一区二区小说| 欧美日韩一区二区三区视频播放| 日韩1区在线| 久久99高清| 欧美日韩18| 日韩精品电影一区亚洲| 亚洲视频二区| 国产视频一区在线观看一区免费| 久久久久午夜电影| 成人羞羞在线观看网站| 国产一区二区亚洲| 久久精品国产一区二区| 久久激情av| 国产日产一区| 国产日韩三级| 久久av电影| 久久亚洲国产精品尤物| 精品一区不卡| 成人精品国产亚洲| 色爱综合网欧美| 精品福利久久久| 精品久久久中文字幕| 国产九一精品| 亚洲天堂免费电影| 日韩av二区| 日本少妇一区| 成人精品天堂一区二区三区| 久久久国产精品一区二区中文| 日韩久久一区二区三区| 日韩欧美二区| 亚洲午夜黄色| 在线一区免费| 亚洲一区国产| 综合国产视频| 日韩精品久久理论片| 欧美日韩夜夜| 欧美成a人片免费观看久久五月天| 精品黄色一级片| 麻豆国产在线| 好看不卡的中文字幕| 午夜一级在线看亚洲| 视频一区中文字幕精品| 欧美日韩18| 成人午夜在线| 激情婷婷欧美| 免费成人在线视频观看| 欧美日韩一区二区国产| 久久精品二区亚洲w码| 91欧美在线| 在线日韩av| 久久最新视频| 国产剧情一区二区在线观看| 国内一区二区三区| 91精品二区| 最新国产精品久久久| 亚洲三级在线| 欧美国产三级| 国产欧美一区二区三区精品酒店| 日本久久成人网| 亚洲免费福利一区| 国产videos久久| 午夜在线一区| 久久国产欧美日韩精品| 日韩伦理在线一区| 久久午夜影视| 欧美精品不卡| 91精品91| 国产精品亚洲四区在线观看| 日韩在线欧美| 一区二区国产精品| 欧美xxxx性| 欧美在线亚洲| 欧美日韩午夜电影网| 人在线成免费视频| 亚洲欧美网站在线观看| 久久中文在线| 香蕉久久国产| 国产精品99久久精品| 亚洲一区日韩| 韩国女主播一区二区三区| 亚洲中午字幕| 精品久久免费| 亚洲va久久久噜噜噜久久| 亚洲美女久久精品| 日韩高清二区| 日韩在线欧美| 国产精品一区二区中文字幕| 久久在线视频免费观看| 日韩av黄色在线| 婷婷成人在线| 久久中文欧美| 亚洲涩涩av| 精品成人免费一区二区在线播放| 日韩精品一区二区三区免费视频|