講 Python 裝飾器前,我想先舉個例子,雖有點污,但跟裝飾器這個話題很貼切。
談裝飾器前,還要先要明白一件事,Python 中的函數(shù)和 Java、C++不太一樣,Python 中的函數(shù)可以像普通變量一樣當(dāng)做參數(shù)傳遞給另外一個函數(shù),例如:
先來看一個簡單例子,雖然實際代碼可能比這復(fù)雜很多:
現(xiàn)在有一個新的需求,希望可以記錄下函數(shù)的執(zhí)行日志,于是在代碼中添加日志代碼:
簡單裝飾器
@ 語法糖
*args、**kwargs
可能有人問,如果我的業(yè)務(wù)邏輯函數(shù) foo 需要參數(shù)怎么辦?比如:
我們可以在定義 wrapper 函數(shù)的時候指定參數(shù):
比如:
這時,你就可以把 wrapper 函數(shù)指定關(guān)鍵字函數(shù):
帶參數(shù)的裝飾器
@use_logging(level="warn")等價于@decorator
類裝飾器
functools.wraps
例子:
裝飾器順序
一個函數(shù)還可以同時定義多個裝飾器,比如: