python_類裝飾器
阿新 • • 發佈:2018-05-04
python 類裝飾器 python類裝飾器 一.定義
裝飾器就是一個給對象添加額外功能的函數,其本質是函數。它的基本構造:高階函數+函數嵌套+閉包。基礎知識講解詳見:http://blog.51cto.com/10836356/2095118
二.簡單類的裝飾器
我們先看簡單的類的裝飾器,如果我們需要給任意一個類添加一個打印功能,即:沒當操作這個類時,就打印”定義了一個裝飾類函數”,見下圖:
@Decorator #相當於執行 School = Decorator(School)
註釋內容若有疑問,請參考:http://blog.51cto.com/10836356/2095118
上面代碼塊為:
裝飾器就是一個給對象添加額外功能的函數,其本質是函數。它的基本構造:高階函數+函數嵌套+閉包。基礎知識講解詳見:http://blog.51cto.com/10836356/2095118
二.簡單類的裝飾器
我們先看簡單的類的裝飾器,如果我們需要給任意一個類添加一個打印功能,即:沒當操作這個類時,就打印”定義了一個裝飾類函數”,見下圖:
@Decorator #相當於執行 School = Decorator(School)
註釋內容若有疑問,請參考:http://blog.51cto.com/10836356/2095118
上面代碼塊為:
#給每個類打印一句話 def Decorator(obj): print("定義了一個裝飾器函數") return obj @Decorator #相當於執行 School = Decorator(School) class School(): pass
如果我們要給該類添加一個數據屬性和一個函數屬性,又該如何定義這個裝飾器呢?見下圖:
代碼塊如下:
#給每個類添加一個數據屬性和一個函數屬性 def Decorator(obj):# print(School.__dict__) #添加數據屬性 obj.addr = "浙江省杭州市" def price(): pass #添加函數屬性 obj.price = price return obj @Decorator #相當於執行 School = Decorator(School) class School(): def __init__(self,name,price): self.name =name self.price =price #打印類的屬性字典 print(School.__dict__)
三.高級類的裝飾器
此時,在實際場景中可能需要在裝飾器中使用變量參數,那麽該如何實現呢?
在二中只利用了裝飾器中的高階函數的概念,要實現上述的需求,就需要使用裝飾器構造的另外兩部分:函數嵌套、閉包。如下圖所示,我們需要給類添加一個數據屬性,但是此時不同的類要求添加的屬性是可變的,處理方法見下圖:
多個類使用該裝飾器添加不同的屬性,如下圖:
該部分代碼塊如下:
#給每個類添加一個可變的數據屬性 def Decorator(**kwargs): def add(obj): "添加數據屬性" # print(‘調用外部函數的**kwargs‘,kwargs) for key,val in kwargs.items(): # 添加數據屬性 setattr(obj,key,val) return obj # print("外部傳入的參數為:",kwargs) return add @Decorator(addr = "浙江省杭州市",name ="浙江大學") #執行順序:1.運行Decorator函數,先打印外部的傳入的參數,返回add函數名;2.再執行School = add(School) class School(): def __init__(self,price): self.price =price @Decorator(addr = "湖北省",price =12000) class School1(): pass print(School.__dict__) print(School1.__dict__)
四.類的裝飾器在實際中的應用
待完善
python_類裝飾器