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,這就造成了裝飾器的效果。說明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ǔ)學(xué)習(xí)之奇異的GUI對(duì)話框
今天跨進(jìn)了GUI編程的園地,才發(fā)現(xiàn)python語(yǔ)言是這么的好玩,文中對(duì)GUI對(duì)話框作了非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)python的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05淺析Python數(shù)字類型和字符串類型的內(nèi)置方法
這篇文章主要介紹了Python數(shù)字類型和字符串類型的內(nèi)置方法,本文通過實(shí)例代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12一小時(shí)學(xué)會(huì)TensorFlow2之大幅提高模型準(zhǔn)確率
這篇文章主要介紹了TensorFlow2之大幅提高模型準(zhǔn)確率,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Python構(gòu)造自定義方法來(lái)美化字典結(jié)構(gòu)輸出的示例
這篇文章主要介紹了用Python構(gòu)造自定義方法來(lái)美化字典結(jié)構(gòu)輸出的示例,原理就是利用遞歸法來(lái)拼接字符串,需要的朋友可以參考下2016-06-06Python實(shí)現(xiàn)從log日志中提取ip的方法【正則提取】
這篇文章主要介紹了Python實(shí)現(xiàn)從log日志中提取ip的方法,涉及Python文件讀取、數(shù)據(jù)遍歷、正則匹配等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03python如何標(biāo)準(zhǔn)化日期時(shí)間格式轉(zhuǎn)化成非標(biāo)準(zhǔn)化格式
這篇文章主要介紹了python如何標(biāo)準(zhǔn)化日期時(shí)間格式轉(zhuǎn)化成非標(biāo)準(zhǔn)化格式問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06