小編寫(xiě)這篇文章的一個(gè)主要目的,主要是來(lái)給大家詳細(xì)解答一些關(guān)于Python Decorator的相關(guān)知識(shí),涉及到的內(nèi)容主要是關(guān)于裝飾器的一些介紹,比如,裝飾器的一些常見(jiàn)創(chuàng)建方法,還有一些具體的場(chǎng)景,下面就給大家詳細(xì)解答下。
前言
1.裝飾器本質(zhì)是一個(gè)語(yǔ)法糖,是對(duì)被裝飾方法或類進(jìn)行的功能擴(kuò)充,是一種面向切面的實(shí)現(xiàn)方法
2.裝飾器可以分成方法裝飾器和類裝飾器,他們的區(qū)別是一個(gè)是用函數(shù)實(shí)現(xiàn)的裝飾器,一個(gè)是用類實(shí)現(xiàn)的裝飾器,他們也都能在方法和類上進(jìn)行裝飾
3.類裝飾器看起來(lái)結(jié)構(gòu)更加清晰,因此下面的代碼實(shí)現(xiàn)的裝飾器全是類裝飾器
一、創(chuàng)建方式
1.創(chuàng)建“裝飾方法”的類裝飾器
from functools import wraps #裝飾器類 class MyDecorator(object): def __init__(self,plusNum): self.plusNum=plusNum#裝飾器入?yún)? def __call__(self,func): wraps(func)#wraps保證裝飾器不改變被裝飾方法的原有函數(shù)結(jié)構(gòu) def wrapped_function(*args,**kwargs): #調(diào)用被裝飾方法前執(zhí)行一些操作--------------- #如果不加wraps,此處打印結(jié)果將是 funcName=func.__name__ print("funcName:{}".format(funcName)) #--------------------------------------- #修改被裝飾方法的入?yún)?- num1=args[0]+2 num2=args[1]+3 args=(num1,num2) #------------------- #執(zhí)行被裝飾方法------------- res=func(*args,**kwargs) #------------------------- #調(diào)用被裝飾方法后執(zhí)行一些操作------------- print("do something after the func...") #------------------------------------- #修改被裝飾方法的出參-- res+=self.plusNum #------------------- #返回被裝飾方法的參數(shù) return res #返回裝飾器方法 return wrapped_function #被裝飾的方法 MyDecorator(3) def add(num1,num2): return num1+num2 if __name__=='__main__': #整體執(zhí)行流程: #1.打印add方法名 #2.修改被裝飾方法入?yún)? #3.執(zhí)行被裝飾方法 #4.調(diào)用被裝飾方法后執(zhí)行一些操作 #5.修改被裝飾方法的出參 #6.打印結(jié)果 print(add(5,3)) #funcName:add #do something after the func... #16
2.創(chuàng)建“裝飾類中方法”的類裝飾器
from functools import wraps #裝飾器類 class MyDecorator(object): def __init__(self,plusNum): self.plusNum=plusNum#裝飾器入?yún)? def __call__(self,func): wraps(func)#wraps保證裝飾器不改變被裝飾方法的原有函數(shù)結(jié)構(gòu) def wrapped_function(*args,**kwargs): #此處與直接裝飾方法相同 #調(diào)用被裝飾方法前執(zhí)行一些操作--------------- #如果不加wraps,此處打印結(jié)果將是 funcName=func.__name__ print("funcName:{}".format(funcName)) #--------------------------------------- #此處需要注意,如果需要修改入?yún)⒌闹担敲磦鲄⒌乃饕菑?開(kāi)始而不是從0開(kāi)始,因?yàn)榈谝粋€(gè)入?yún)⒌闹凳菍?shí)例本身self #修改被裝飾方法的入?yún)?- num1=args[1]+2 num2=args[2]+3 args=(args[0],num1,num2) #------------------- #此處與直接裝飾方法相同 #執(zhí)行被裝飾方法------------- res=func(*args,**kwargs) #------------------------- #此處與直接裝飾方法相同 #調(diào)用被裝飾方法后執(zhí)行一些操作------------- print("do something after the func...") #------------------------------------- #此處與直接裝飾方法相同 #修改被裝飾方法的出參-- res+=self.plusNum #------------------- #返回被裝飾方法的參數(shù) return res #返回裝飾器方法 return wrapped_function class Operation(object): #被裝飾的類方法 MyDecorator(3) def add(self,num1,num2): return num1+num2 if __name__=='__main__': op=Operation() print(op.add(3,5)) #funcName:add #do something after the func... #16
3.創(chuàng)建“裝飾類”的類裝飾器
from functools import wraps #裝飾器類 class MyDecorator(object): def __init__(self,plusNum): self.plusNum=plusNum#裝飾器入?yún)? def __call__(self,Cls): wraps(Cls)#wraps保證裝飾器不改變被裝飾類的原有結(jié)構(gòu) def wrapped_function(*args,**kwargs): #調(diào)用被裝飾類前執(zhí)行一些操作--------------- #如果不加wraps,此處打印結(jié)果將是 clsName=Cls.__name__ print("clsName:{}".format(clsName)) #--------------------------------------- #修改被裝飾類的入?yún)?-- num1=args[0]+2 num2=args[1]+3 args=(num1,num2) #------------------- #初始化被裝飾類------------- cls=Cls(*args,**kwargs) #------------------------- #初始化后執(zhí)行一些操作-------------------- print("do something after the func...") #------------------------------------- #給類實(shí)例增加增加屬性和方法--------------------- cls.mul=3#增加屬性 cls.plusNumber=self.plusNumber#增加方法 #------------------------------------------- #返回實(shí)例 return cls #返回裝飾器方法 return wrapped_function def plusNumber(self,num): return num+self.plusNum #被裝飾的類 MyDecorator(3) class Operation(object): def __init__(self,num1,num2): self.num1=num1 self.num2=num2 def add(self): num3=self.num1+self.num2 num4=self.plusNumber(num3*self.mul)#使用裝飾器插入的屬性和方法 return num4 if __name__=='__main__': #整體執(zhí)行流程: #1.打印Operation類名 #2.修改類的初始化參數(shù) #3.初始化類 #4.初始化完成后執(zhí)行一些方法 #5.給初始化的實(shí)例新增mul屬性和plusNumber方法 #6.實(shí)例執(zhí)行add函數(shù)并調(diào)用新增的裝飾函數(shù)和裝飾屬性 #7.輸出結(jié)果 op=Operation(3,5) print(op.add()) #clsName:Operation #do something after the func... #42
二、常用場(chǎng)景
1.記錄日志
#todo
2.性能測(cè)試
#todo
3.循環(huán)執(zhí)行
#todo
4.攔截器
#todo
5.數(shù)據(jù)預(yù)處理(數(shù)據(jù)清洗)
#todo
6.功能植入
#todo
綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家?guī)?lái)幫助。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/128395.html
摘要:使用類裝飾器,優(yōu)點(diǎn)是靈活性大,高內(nèi)聚,封裝性。不過(guò)不用擔(dān)心,有,本身也是一個(gè)裝飾器,它的作用就是把原函數(shù)的元信息拷貝到裝飾器函數(shù)中,使得裝飾器函數(shù)也有和原函數(shù)一樣的元信息。 showImg(https://segmentfault.com/img/bVbrFWb?w=742&h=484);Python的裝飾器(decorator)是一個(gè)很棒的機(jī)制,也是熟練運(yùn)用Python的必殺技之一。...
摘要:下面我們一起拋去無(wú)關(guān)概念,簡(jiǎn)單地理解下的裝飾器。用函數(shù)實(shí)現(xiàn)裝飾器裝飾器要求入?yún)⑹呛瘮?shù)對(duì)象,返回值是函數(shù)對(duì)象,嵌套函數(shù)完全能勝任。為了對(duì)調(diào)用方透明,裝飾器返回的對(duì)象要偽裝成被裝飾的函數(shù)。 來(lái)源:http://www.lightxue.com/under... ???????Python有大量強(qiáng)大又貼心的特性,如果要列個(gè)最受歡迎排行榜,那么裝飾器絕對(duì)會(huì)在其中。???????剛接觸裝飾器,會(huì)...
摘要:一般情況下,我們使用裝飾器提供的語(yǔ)法糖,來(lái)簡(jiǎn)化上面的寫(xiě)法像上面的情況,可以動(dòng)態(tài)修改函數(shù)或類功能的函數(shù)就是裝飾器。本文標(biāo)題為會(huì)打扮的裝飾器本文鏈接為參考資料修飾器的函數(shù)式編程中的裝飾器介紹思誠(chéng)之道裝飾器入門(mén)與提高賴明星 裝飾器 我們知道,在 Python 中,我們可以像使用變量一樣使用函數(shù): 函數(shù)可以被賦值給其他變量 函數(shù)可以被刪除 可以在函數(shù)里面再定義函數(shù) 函數(shù)可以作為參數(shù)傳遞給另外...
摘要:概括的講,裝飾器的作用就是為已經(jīng)存在的函數(shù)或?qū)ο筇砑宇~外的功能。在理解這些裝飾器之前,最好對(duì)函數(shù)的閉包和裝飾器的接口約定有一定了解。是一個(gè)非常簡(jiǎn)單的裝飾器加強(qiáng)包。 Python中的裝飾器是你進(jìn)入Python大門(mén)的一道坎,不管你跨不跨過(guò)去它都在那里。 為什么需要裝飾器 我們假設(shè)你的程序?qū)崿F(xiàn)了say_hello()和say_goodbye()兩個(gè)函數(shù)。 def say_hello(): ...
摘要:所以這是一篇插隊(duì)的文章,用于去理解中的裝飾器和概念。因此,該的作用就是根據(jù)入?yún)⒎祷鼐唧w的描述符。其次局部來(lái)看,裝飾器具體應(yīng)用表達(dá)式是,其函數(shù)簽名和是一模一樣。等裝飾器語(yǔ)法,是和直接使用是等效等價(jià)的。 ================前言=================== 初衷:以系列故事的方式展現(xiàn) MobX 源碼邏輯,盡可能以易懂的方式講解源碼; 本系列文章: 《【用故事解...
閱讀 917·2023-01-14 11:38
閱讀 888·2023-01-14 11:04
閱讀 747·2023-01-14 10:48
閱讀 2025·2023-01-14 10:34
閱讀 954·2023-01-14 10:24
閱讀 829·2023-01-14 10:18
閱讀 504·2023-01-14 10:09
閱讀 581·2023-01-14 10:02