python的裝飾器是用來裝飾函式的。這是什麼意思呢?假如我們有乙個函式,這個函式的功能不能滿足我們現有的需求,那麼我們可以通過裝飾器在這個函式執行前執行後做一些我們需要的操作(如果函式本身功能不滿足,那就直接修改方法體了,不需要裝飾器幫忙)。
1. 簡單裝飾器
裝飾器的語法糖是使用@
符號表示,裝飾器本身也是乙個函式,只不過引數是函式而已。
def decor_function(func):
print("[%s] %s() called" % (ctime(), func.__name__))
return func()
@decor_function
def my_func():
print("hello world")
...my_func()
[mon jul 9 17:07:40 2018] my_func() called
hello world
2. 修飾含有引數的函式
函式定義可以使用任意的引數,那麼裝飾器函式如何處理呢?其實很簡單,使用*args
和**kargs
就可以方便的呼叫了,只需要在裝飾器函式的返回的函式中將引數傳遞給被修飾的函式就可以了。
def decor_function(func):
print("[%s] %s() called" % (ctime(), func.__name__))
return func(*args, **kargs)
@decor_function
def my_func_with_param(name):
print("hello", name)
my_func_with_param("joe")
[mon jul 9 17:12:58 2018] my_func_with_param() called
hello joe
3. 裝飾函式帶引數
裝飾器函式本身也是可以帶引數的,使用引數,可以根據具體的場景新增不同的功能實現。
def decor_function_with_parm(level):
if level == "info":
logging.info("info message logged")
elif level == "error":
logging.error("error message logged")
else:
logging.debug("debug message logged")
func(*args, **kargs)
@decor_function_with_parm(level="info")
def my_func2(name):
print("hello,", name)
my_func2("joe")
帶引數的裝飾器函式寫起來比較麻煩,因為需要處理的引數比較多,一般最外層的函式處理裝飾器引數,接下來的函式處理func
,最後一層函式用來處理被修飾的函式的引數。
4. 多重修飾
乙個函式可以被多個裝飾器修飾,like this
@decor_function_with_parm(level="info")
@decor_function
def my_func():
print("hello world")
執行的順序是:
f = decor_function_with_parm(level='info', decor_function(my_func()))
5.使用類來處理
類的__call__()
方法可以把類當成函式來處理,所以類也可以用做裝飾器
class decor:
def __init__(self, func):
print("__init__ method called")
self.func = func
def __call__(self, *args, **kargs):
print("__call__ method called")
self.func(*args, **kargs)
@decor
def func(name):
print("func called")
print("hello,",name)
func("joe")
使用類做裝飾器時,init函式中新增被修飾函式的引用,在call函式中處理引數。
__init__ method called
__call__ method called
func called
hello, joe
6.保留函式的元資訊def decor_function(func):
@wraps(func)
print("[%s] %s() called" % (ctime(), func.__name__))
print(func.__name__)
return func(*args, **kargs)
@decor_function
def my_func_with_param(name):
print("hello", name)
[mon jul 9 18:16:11 2018] my_func_with_param() called
my_func_with_param
hello joe
參考:理解 python 裝飾器看這一篇就夠了 python中的裝飾器
其實去年就開始學python了,零零散散,陸陸續續學了點,期間學習了python web開發,爬蟲系統 但是一些基礎性的知識點長時間不看了就會忘,所以寫個部落格記錄下來,忘了可以隨時檢視,不用回去看 了,希望也能幫助大家學習哈。python中的裝飾器decorator其實是乙個高階函式,它接受乙個函...
Python 中的裝飾器
1.基本概念 問題 裝飾器是什麼?解答 嚴格來說,裝飾器只是語法糖,裝飾器是可呼叫的物件,可以像常規的可呼叫物件那樣呼叫,特殊的地方是裝飾器的引數是乙個函式 問題 裝飾器有什麼特性?解答 裝飾器有 個特性,一是可以把被裝飾的函式替換成其他函式,二是可以在載入模組時候立即執行 def decorate...
python中的 裝飾器
示例 def fun a arg print a arg fun a deffun b print b 輸出 c python34 python.exe c users administrator desktop test.pyab process finished with exit code 0...