Python中裝飾器的一大優(yōu)勢在于其通用性。通用裝飾器是一種不具體關注函數參數和返回值的裝飾器。其能夠應用于任何函數,這些函數可以具有任何的參數和返回值類型,因此它能夠極大地提高代碼的復用性和靈活性。
下面我們來看一個簡單的示例。假設我們有一個函數,這個函數能夠計算任意兩個數的加法運算。
def add(a, b): return a + b
現在我們需要對這個函數進行裝飾器的增強,為其添加日志記錄功能。我們可以使用以下通用裝飾器實現:
def log_decorator(func): def wrapper(*args, **kwargs): print(f"調用函數 {func.__name__}") return func(*args, **kwargs) return wrapper @log_decorator def add(a, b): return a + b
在上面的代碼中,我們定義了通用裝飾器log_decorator,它接受一個參數func,即被裝飾的函數。在裝飾器函數中,我們定義了一個wrapper函數,該函數接受任意數量的參數和關鍵字參數,并在調用原函數之前輸出一條日志。之后,wrapper函數調用func函數,將其返回值傳遞給函數調用方。
最后一行代碼使用@符號將裝飾器應用于我們的add函數。這意味著我們現在調用add函數時,實際上是調用了經過log_decorator裝飾器增強的wrapper函數。
我們現在可以測試一下這個被增強的函數,看它是否能正常輸出日志:
print(add(1, 2))
輸出結果應該是:
調用函數 add 3
可以看到,我們成功地將日志記錄功能添加到了add函數中。這個由通用裝飾器實現的增強操作,也可以應用于其它任何函數。
在實際的應用中,我們可能需要多個不同的裝飾器來為函數添加不同的增強功能。通用裝飾器可以方便地實現多重裝飾器的嵌套。我們只需要在定義函數時使用多個@符號,將裝飾器一層層地應用到函數上,就可以實現多重增強效果。