這篇文章主要介紹Python裝飾器decorator怎么用,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)專注于五河企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城網(wǎng)站建設(shè)。五河網(wǎng)站建設(shè)公司,為五河等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站建設(shè),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)什么是裝飾器(decorator)
簡(jiǎn)單來(lái)說(shuō),可以把裝飾器理解為一個(gè)包裝函數(shù)的函數(shù),它一般將傳入的函數(shù)或者是類做一定的處理,返回修改之后的對(duì)象.所以,我們能夠在不修改原函數(shù)的基礎(chǔ)上,在執(zhí)行原函數(shù)前后執(zhí)行別的代碼.比較常用的場(chǎng)景有日志插入,事務(wù)處理等.
裝飾器
最簡(jiǎn)單的函數(shù),返回兩個(gè)數(shù)的和
def calc_add(a, b): return a + b calc_add(1, 2)
但是現(xiàn)在又有新的需求,計(jì)算求和操作耗時(shí),很簡(jiǎn)單,求和前獲取一下時(shí)間,求和后再獲取一次,求差即可
import datetime def calc_add(a, b): start_time = datetime.datetime.now() result = a + b end_tiem = datetime.datetime.now() print "result:", result, "used:", (end_tiem - start_time).microseconds, "μs" return result calc_add(1, 2)
現(xiàn)在呢,函數(shù)calc_diff(a, b)
,計(jì)算a-b,也想計(jì)算減法操作的時(shí)間差,很好辦,把那段代碼復(fù)制過(guò)去.但是假如我們現(xiàn)在想編的是一個(gè)數(shù)學(xué)函數(shù)庫(kù),各種函數(shù)都想計(jì)算其執(zhí)行耗時(shí),總不能一個(gè)一個(gè)復(fù)制代碼,想個(gè)更好的辦法.
我們知道,在Python中函數(shù)也是被視為對(duì)象的,可以作為參數(shù)傳遞,那么假如把計(jì)算耗時(shí)的獨(dú)立為一個(gè)單獨(dú)的函數(shù)calc_spend_time()
,然后把需要計(jì)算耗時(shí)的函數(shù)例如calc_add的引用傳遞給它,在calc_spend_time中調(diào)用calc_add,這樣所有的需要計(jì)算耗時(shí)的函數(shù)都不用修改自己的代碼了.
def calc_spend_time(func, *args, **kargs): start_time = datetime.datetime.now() result = func(*args, **kargs) end_tiem = datetime.datetime.now() print "result:", result, "used:", (end_tiem - start_time).microseconds, "μs" def calc_add(a, b): return a + b calc_spend_time(calc_add, 1, 1) # calc_spend_time(calc_add, a=1, b=2)
看起來(lái)也不錯(cuò),負(fù)責(zé)計(jì)算的函數(shù)不用更改,只需調(diào)用的時(shí)候作為參數(shù)傳給計(jì)算時(shí)間差的函數(shù).但就是這,調(diào)用的時(shí)候形式變了,不再是clac(1, 2),而是calc_spend_time(clac_add, 1, 2),萬(wàn)一calc_add大規(guī)模被調(diào)用,那么還得一處一處找,然后修改過(guò)來(lái),還是很麻煩.如果想不修改代碼,就得使clac()
和calc_spend_time(clac)
效果一樣,那么可以在calc_spend_time()
里把傳入的clac包裝一下,然后返回包裝后的新的函數(shù),再把返回的包裝好的函數(shù)賦給clac,那么calc()的效果就和上例calc_spend_time(calc())
效果一樣.
import datetime def calc_spend_time(func): def new_func(a, b): start_time = datetime.datetime.now() result = func(a, b) end_tiem = datetime.datetime.now() print "result:", result, "used:", (end_tiem - start_time).microseconds, "μs" return new_func def calc_add(a, b): return a + b calc_add = calc_spend_time(calc_add) calc_add(1, 2)
語(yǔ)法糖
上面的例子就是裝飾器的概念,包裝函數(shù)的函數(shù).事實(shí)上上面的例子還可以更精簡(jiǎn)
import datetime def calc_spend_time(func): def new_func(a, b): start_time = datetime.datetime.now() result = func(a, b) end_tiem = datetime.datetime.now() print "result:", result, "used:", (end_tiem - start_time).microseconds, "μs" return new_func @calc_spend_time def calc_add(a, b): return a + b calc_add(1, 2)
@calc_spend_time
就是語(yǔ)法糖,它的本質(zhì)就是:calc_add = calc_spend_time(calc_add)
無(wú)參數(shù)的函數(shù)裝飾器
import datetime def calc_spend_time(func): def new_func(*args, **kargs): start_time = datetime.datetime.now() result = func(*args, **kargs) end_tiem = datetime.datetime.now() print "result:", result, "used:", (end_tiem - start_time).microseconds, "μs" return new_func @calc_spend_time def calc_add(a, b): return a + b @calc_spend_time def calc_diff(a, b): return a - b calc_add(a=1, b=2) calc_diff(1, 2)
注:
*args:把所有的參數(shù)按出現(xiàn)順序打包成list
**kargs:把所有的key=value形式的參數(shù)打包成一個(gè)dict
帶參數(shù)的函數(shù)裝飾器
假如我們需要知道函數(shù)的一些額外信息,例如函數(shù)作者,可以通過(guò)給裝飾器函數(shù)增加參數(shù)來(lái)實(shí)現(xiàn).
import datetime def calc_spend_time(author): def first_deco(func): def new_func(*args, **kargs): start_time = datetime.datetime.now() result = func(*args, **kargs) end_tiem = datetime.datetime.now() print author, "result:", result, "used:", (end_tiem - start_time).microseconds, "μs" return new_func return first_deco @calc_spend_time('author_1') def calc_add(a, b): return a + b @calc_spend_time('author_2') def calc_diff(a, b): return a - b calc_add(a=1, b=2) calc_diff(1, 2)
Python內(nèi)置裝飾器
Python內(nèi)置的裝飾器有三個(gè):staticmethod,classmethod和property.
staticmethod:把類中的方法定義為靜態(tài)方法,使用staticmethod裝飾的方法可以使用類或者類的實(shí)例對(duì)象來(lái)調(diào)用,不需要傳入self
class Human(object): """docstring for Human""" def __init__(self): super(Human, self).__init__() @staticmethod def say(message): if not message: message = 'hello' print 'I say %s' % message def speak(self, message): self.say(message) Human.say(None) human = Human() human.speak('hi')
輸出:
I say hello I say hi
classmethod:把類中的方法定義為類方法,使用classmethod裝飾的方法可以使用類或者類的實(shí)例對(duì)象來(lái)調(diào)用,并將該class對(duì)象隱式的作為第一個(gè)參數(shù)傳入
class Human(object): """docstring for Human""" def __init__(self): super(Human, self).__init__() self.message = '111' def say(message): if not message: message = 'hello' print 'I say %s' % message @classmethod def speak(cls, message): if not message: message = 'hello' cls.say(message) human = Human() human.speak('hi')
輸出同上例
property:把方法變成屬性
class Human(object): """docstring for Human""" def __init__(self, value): super(Human, self).__init__() self._age = value @property def age(self): return self._age human = Human(20) print human.age
以上是“Python裝飾器decorator怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站名稱:Python裝飾器decorator怎么用-創(chuàng)新互聯(lián)
文章源于:http://muchs.cn/article12/dhegdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、響應(yīng)式網(wǎng)站、Google、搜索引擎優(yōu)化、企業(yè)網(wǎng)站制作、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容