Python中的裝飾器使用
Python裝飾器用法
Python的裝飾器是個(gè)好東西,它能干很多事情。
但對(duì)于新手,它看起來似乎沒那么簡(jiǎn)單。
但事實(shí)上,裝飾器本身也只是個(gè)函數(shù)。
import time
def log(func):
? ? def wrapper(*args, **kwargs):
? ? ? ? start = time.time()
? ? ? ? result = func(*args, **kwargs)
? ? ? ? end = time.time()
? ? ? ? print("The func '{}' used {}s.".format(func.__name__, end-start))
? ? ? ? return result
? ? return warpper這一個(gè)裝飾器,當(dāng)我們這樣使用時(shí)
@log
def fucok(name):
? ? """Fucok someone"""
? ? print("Fucok", name)它只是執(zhí)行了fucok = log(fucok)這樣一句代碼而已。
也就是說,我們表面上是用fucok("myself"),事實(shí)上執(zhí)行的都是log(fucok)("myself")。因?yàn)镻ython里面都是對(duì)象嘛。
同樣的道理,假設(shè)我們定義了一個(gè)帶參數(shù)的裝飾器logging,它實(shí)際上執(zhí)行的是
func = logging(arguments)(func)
也就是上面那個(gè)不帶參數(shù)的裝飾器多定義一層就行了。
import time
def logging(arguments):
? ? def log(func):
? ? ? ? def warpper(*args, **kwargs):
? ? ? ? ? ? start = time.time()
? ? ? ? ? ? result = func(*args, **kwargs)
? ? ? ? ? ? end = time.time()
? ? ? ? ? ? print("The func '{}' used {}s.".format(func.__name__, end-start))
? ? ? ? ? ? return result
? ? ? ? return warpper
? ? # do something
? ? return log但,當(dāng)我們使用一個(gè)裝飾器之后,它會(huì)將原本的函數(shù)元信息給覆蓋掉。譬如:函數(shù)名稱,函數(shù)文檔等等。
例如上例
print(fucok.__name__) print(fucok.__doc__)
你會(huì)發(fā)現(xiàn),函數(shù)信息全部沒了!fucok它不叫fucok,改名叫wrapper了。它的文檔也變成了none。
解決辦法很簡(jiǎn)單,定義裝飾器的時(shí)候用warps裝飾器裝飾接受原函數(shù)參數(shù)的那一層就行了。
這個(gè)來自functools模塊的裝飾器能幫你復(fù)制函數(shù)的元信息到被綁定的函數(shù)身上。
修改裝飾器如下(其實(shí)就加了一行代碼hhh)
import time
from functools import wraps
def log(func):
? ? @wraps(func)
? ? def warpper(*args, **kwargs):
? ? ? ? start = time.time()
? ? ? ? result = func(*args, **kwargs)
? ? ? ? end = time.time()
? ? ? ? print("The func '{}' used {}s.".format(func.__name__, end-start))
? ? ? ? return result
? ? return warpper當(dāng)我們?cè)龠\(yùn)行
print(fucok.__name__) print(fucok.__doc__)
就能看到函數(shù)的的元信息沒變了。
裝飾器定義時(shí)加@wraps是個(gè)好習(xí)慣。
一個(gè)較為實(shí)用的裝飾器demo在該專題的另一篇文章:函數(shù)參數(shù)類型檢查
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python3.9和pycharm的安裝教程并創(chuàng)建簡(jiǎn)單項(xiàng)目的步驟
這篇文章主要介紹了python3.9和pycharm的安裝教程并創(chuàng)建簡(jiǎn)單項(xiàng)目的步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
AI:如何訓(xùn)練機(jī)器學(xué)習(xí)的模型
這篇文章主要介紹了是如何進(jìn)行機(jī)器學(xué)習(xí)的模型的訓(xùn)練,全文邏輯清晰,簡(jiǎn)單易懂,如果您正在學(xué)習(xí)機(jī)器學(xué)習(xí)那么可以參考下,說不定會(huì)有不一樣的收貨2021-04-04
python如何實(shí)現(xiàn)數(shù)據(jù)的線性擬合
這篇文章主要為大家詳細(xì)介紹了python如何實(shí)現(xiàn)數(shù)據(jù)的線性擬合,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
OpenCV結(jié)合selenium實(shí)現(xiàn)滑塊驗(yàn)證碼
本文主要介紹了OpenCV結(jié)合selenium實(shí)現(xiàn)滑塊驗(yàn)證碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
python二進(jìn)制轉(zhuǎn)換模塊的具體用法
在pyton中,通過struct模塊來對(duì)二進(jìn)制進(jìn)行轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Python使用Flask框架同時(shí)上傳多個(gè)文件的方法
這篇文章主要介紹了Python使用Flask框架同時(shí)上傳多個(gè)文件的方法,實(shí)例分析了Python中Flask框架操作文件實(shí)現(xiàn)上傳的技巧,需要的朋友可以參考下2015-03-03

