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)文章
libreoffice python 操作word及excel文檔的方法
這篇文章主要介紹了libreoffice python 操作word及excel文檔的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python簡(jiǎn)單獲取自身外網(wǎng)IP的方法
這篇文章主要介紹了Python簡(jiǎn)單獲取自身外網(wǎng)IP的方法,涉及Python基于第三方平臺(tái)獲取本機(jī)外網(wǎng)IP的操作技巧,需要的朋友可以參考下2016-09-09python 統(tǒng)計(jì)數(shù)組中元素出現(xiàn)次數(shù)并進(jìn)行排序的實(shí)例
今天小編就為大家分享一篇python 統(tǒng)計(jì)數(shù)組中元素出現(xiàn)次數(shù)并進(jìn)行排序的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07淺談Python中用datetime包進(jìn)行對(duì)時(shí)間的一些操作
下面小編就為大家?guī)硪黄獪\談Python中用datetime包進(jìn)行對(duì)時(shí)間的一些操作。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06Python創(chuàng)建Getter和Setter的方法詳解
Getters?和?Setters?是幫助我們?cè)O(shè)置類變量或?qū)傩远鵁o需直接訪問的方法,這篇文章主要和大家介紹了如何在Python中創(chuàng)建Getter和Setter,需要的可以參考下2023-10-10Python?PyQt拖動(dòng)控件對(duì)齊到網(wǎng)格的方法步驟
pyqt是一個(gè)用于創(chuàng)建GUI應(yīng)用程序的跨平臺(tái)工具包,它將python與qt庫(kù)融為一體,下面這篇文章主要給大家介紹了關(guān)于Python?PyQt拖動(dòng)控件對(duì)齊到網(wǎng)格的方法步驟,需要的朋友可以參考下2022-12-12解決Python調(diào)用df.to_csv()出現(xiàn)中文亂碼的問題
在Python使用df.to_csv()時(shí),若出現(xiàn)中文亂碼,可通過加入?yún)?shù)encoding="utf_8_sig"解決,"utf-8"編碼不包含BOM,直接處理文件時(shí)會(huì)將BOM誤讀為內(nèi)容;而"utf_8_sig"會(huì)識(shí)別并處理BOM,避免亂碼,此方法為實(shí)踐經(jīng)驗(yàn),供參考2024-09-09Request的中斷和ErrorHandler實(shí)例解析
這篇文章主要介紹了Request的中斷和ErrorHandler實(shí)例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02