1. 程式人生 > >python_類裝飾器

python_類裝飾器

python 類裝飾器 python類裝飾器

一.定義
裝飾器就是一個給對象添加額外功能的函數,其本質是函數。它的基本構造:高階函數+函數嵌套+閉包。基礎知識講解詳見: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_類裝飾器