使用在Python 2.4 or Later.
兩種調用形式:
1.不帶參數
@A
def f():
Python最後會處理為:
f = A(f)
,可擴充為:
@A
@B
@C
def f():
最終Python會處理為:
f = A(B(C(f)))
2.帶參數:
@A(args)
def f():
Python會處理為:
def f();
_deco = A(args)
f = _deco(f)
Python先執行A(args)得到_deco,然後跟第一種方式一樣的處理函數f。
對應的兩種函數定義方法:
第一種:
def A(func):
#處理func
#如func.attr='decorated'
return func
@A
def f(args): pass
A對f處理完後,仍返回函數對象。 如果要返回一個新的函數,可以為:
def A(func):
#做額外的工作
def new_func(args):
#做額外工作
return func(args)
return new_func
@A
def f(args): pass
注意:new_func的定義形式要和待處理的函數相同。
如果想根據原來函數的結果進行一些處理:
def A(func):
def new_func(*args, **argkw):
result = func(*args, **argkw)
if result:
return new_result
else:
return result
return new_func
@A
def f(args): pass
第二種:
def A(arg):
def _A(func):
def new_func(args):
#do any operation
return func(args)
return new_func
return _A
@A(arg)
def f(args): pass
文檔上說:如果你的decorator在調用時使用了參數,那麼你的decorator函數只會使用這些參數進行調用。因此你需要返回一個新的decorator函數,就和第一種方式定義形式一致了。