一、裝飾器decorator
decorator設(shè)計模式允許動態(tài)地對現(xiàn)有的對象或函數(shù)包裝以至于修改現(xiàn)有的職責(zé)和行為,簡單地講用來動態(tài)地擴展現(xiàn)有的功能。其實也就是其他語言中的AOP的概念,將對象或函數(shù)的真正功能也其他輔助的功能的分離。
二、Python中的decorator
python中的decorator通常為輸入一個函數(shù),經(jīng)過裝飾后返回另一個函數(shù)。 比較常用的功能一般使用decorator來實現(xiàn),例如python自帶的staticmethod和classmethod。
裝飾器有兩種形式:
代碼如下:
@A
def foo():
pass
相當(dāng)于:
代碼如下:
def foo():
pass
foo = A(foo)
第二種為帶參數(shù)的:
代碼如下:
@A(arg)
def foo():
pass
則相當(dāng)于:
代碼如下:
def foo():
pass
foo = A(arg)(foo)
可以看出第一種的裝飾器是個返回函數(shù)的函數(shù),第二種的裝飾器是個返回函數(shù)的函數(shù)的函數(shù)。
python中的decorator可以多個同時使用,如下:
代碼如下:
@A
@B
@C
def f (): pass
# it is same as below
def f(): pass
f = A(B(C(f)))
三、Python中常用的decorator實例
decorator通常用來在執(zhí)行前進行權(quán)限認(rèn)證,日志記錄,甚至修改傳入?yún)?shù),或者在執(zhí)行后對返回結(jié)果進行預(yù)處理,甚至可以截斷函數(shù)的執(zhí)行等等。
實例1:
代碼如下:
from functools import wraps
def logged(func):
@wraps(func)
def with_logging(*args, **kwargs):
print (func.__name__() + " was called")
return func(*args, **kwargs)
return with_logging
@logged
def f(x):
"""does some math"""
return x + x * x
print (f.__name__) # prints 'f'
print (f.__doc__) # prints 'does some math'
注意functools.wraps()函數(shù)的作用:調(diào)用經(jīng)過裝飾的函數(shù),相當(dāng)于調(diào)用一個新函數(shù),那查看函數(shù)參數(shù),注釋,甚至函數(shù)名的時候,就只能看到裝飾器的相關(guān)信息,被包裝函數(shù)的信息被丟掉了。而wraps則可以幫你轉(zhuǎn)移這些信息,參見http://stackoverflow.com/questions/308999/what-does-functools-wraps-do
新聞熱點
疑難解答
圖片精選