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