裝飾器

介紹一下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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章