介紹一下Python的裝飾器?
簡單來說:爲已存在的對象添加額外功能。
在不改變源代碼和調用方法的基礎上,添加額外功能。
優點:提高了程序的可重複利用性,增加了程序的可讀性
詳細來說:
裝飾器有函數裝飾器和類裝飾器
函數裝飾器有帶參和不帶參(最簡單,2層)
介紹:
python的函數裝飾器是一個嵌套函數,外部函數的參數是被裝飾函數名,
返回的是內部函數的引用,內部函數的參數是被裝飾函數的參數,返回的
是被裝飾函數的返回值。
python提供@語法糖,來調用裝飾器,在原函數上加上@裝飾器名
一個函數可被多個裝飾器裝飾,這時候的執行過程是從下自上的
def deco(func):
def wrap(*args, **kwargs):
return func(*args, **kwargs)
return wrap
@deco
def foo(a, b):
return a ** b
------------------------------------------------------------------
裝飾器的調用,在原函數上加上@裝飾器名
實際過程是:
foo = deco(foo)
foo()
將原函數名引用傳遞給裝飾器函數,裝飾器返回一個內置函數引用,最後在調用原函數的時候
實際上是調用了裝飾器的內置函數
當多個裝飾器裝飾一個函數,其執行順序是從下往上,檢驗過程是先檢驗上面的,再檢驗下面的
@deco1
@deco2
@deco3
def foo(x, y):
return x ** y
# 過程拆解 1
fn3 = deco3(foo)
fn2 = deco2(fn3)
fn1 = deco1(fn2)
foo = fn1
foo(3, 4)
# 過程拆解 2
# 單行: deco1( deco2( deco3(foo) ) )(3, 2)
deco1(
deco2(
deco3(foo)
)
)(3, 4)