python中的decorator的作用詳解
1、概念
裝飾器(decorator)就是:定義了一個(gè)函數(shù),想在運(yùn)行時(shí)動(dòng)態(tài)增加功能,又不想改動(dòng)函數(shù)本身的代碼??梢云鸬綇?fù)用代碼的功能,避免每個(gè)函數(shù)重復(fù)性編寫代碼,簡(jiǎn)言之就是拓展原來(lái)函數(shù)功能的一種函數(shù)。在python中,裝飾器(decorator)分為 函數(shù)裝飾器 和 類裝飾器 兩種。python中內(nèi)置的@語(yǔ)言就是為了簡(jiǎn)化裝飾器調(diào)用。
列出幾個(gè)裝飾器函數(shù):
打印日志:@log
檢測(cè)性能:@performance
數(shù)據(jù)庫(kù)事務(wù):@transaction
URL路由:@post('/register')
2、使用方法
(1)無(wú)參數(shù)decorator
編寫一個(gè)@performance,它可以打印出函數(shù)調(diào)用的時(shí)間。
import time def performance(f): def log_time(x): t1 = time.time() res = f(x) t2 = time.time() print 'call %s() in %fs' %(f.__name__,(t2 - t1)) return res return log_time @performance def factorial(n): return reduce(lambda x,y : x*y,range(1,n+1)) print factorial(10)
運(yùn)行結(jié)果:
call factorial() in 0.006009s 2 3628800
運(yùn)行原理:
此時(shí),factorial就作為performance的函數(shù)對(duì)象,傳遞給f。當(dāng)調(diào)用factorial(10)的時(shí)候也就是調(diào)用log_time(10)函數(shù),而在log_time函數(shù)內(nèi)部,又調(diào)用了f,這就造成了裝飾器的效果。說(shuō)明f是被裝飾函數(shù),而x是被裝飾函數(shù)的參數(shù)。
(2)帶參數(shù)decorator
請(qǐng)給 @performace 增加一個(gè)參數(shù),允許傳入's'或'ms'。
import time
def performance(unit):
def perf_decorator(f):
def wrapper(*args, **kw):
t1 = time.time()
r = f(*args, **kw)
t2 = time.time()
t = (t2 - t1)*1000 if unit =='ms' else (t2 - t1)
print 'call %s() in %f %s'%(f.__name__, t, unit)
return r
return wrapper
return perf_decorator
@performance('ms')
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)
運(yùn)行結(jié)果:
call factorial() in 9.381056 ms 2 3628800
運(yùn)行原理:
它的內(nèi)部邏輯為factorial=performance('ms')(factorial);
這里面performance('ms')返回是perf_decorator函數(shù)對(duì)象,performance('ms')(factorial)其實(shí)就是perf_decorator(factorial),然后其余的就和上面是一樣的道理了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python爬蟲基礎(chǔ)之簡(jiǎn)易網(wǎng)頁(yè)搜集器
這篇文章主要介紹了python爬蟲基礎(chǔ)之簡(jiǎn)易網(wǎng)頁(yè)搜集器,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python爬蟲的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
pytorch中model.named_parameters()與model.parameters()解讀
這篇文章主要介紹了pytorch中model.named_parameters()與model.parameters()使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
解決Python Matplotlib繪圖數(shù)據(jù)點(diǎn)位置錯(cuò)亂問(wèn)題
這篇文章主要介紹了解決Python Matplotlib繪圖數(shù)據(jù)點(diǎn)位置錯(cuò)亂問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
Python imutils 填充圖片周邊為黑色的實(shí)現(xiàn)
今天小編就為大家分享一篇Python imutils 填充圖片周邊為黑色的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
Django serializer優(yōu)化類視圖的實(shí)現(xiàn)示例
這篇文章主要介紹了Django serializer優(yōu)化類視圖的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
用Python給圖像算法做個(gè)簡(jiǎn)單應(yīng)用界面
這篇文章主要介紹了用Python給圖像算法做個(gè)簡(jiǎn)單應(yīng)用界面,幫助大家更好的理解和學(xué)習(xí)使用python開發(fā)gui,感興趣的朋友可以了解下2021-05-05

