1. 程式人生 > 其它 >理解python裝飾器

理解python裝飾器

def decorator(func):
    def wrapper(x):
        print("start")
        func(x)
        print("stop")
    return wrapper
@decorator
def hi(x):
    print(x)
hi(12345678)
#a=decorator(hi)
#hi=a
#hi(12345678)
使用裝飾器的目的不再贅述。 裝飾器的實現利用了python中閉包的特性,閉包基於python中一切皆物件的規則,如函式物件可以被當作返回值丟擲,list、dict等結構可以儲存物件或函式等。 外層函式的返回值為內層函式的引用,這樣形式的巢狀函式被稱為閉包,即例子中decorator函式。 裝飾器即定義一個閉包,但是它接收的引數是一個函式(即需要被裝飾的函式),這個傳入的函式,最終流轉進閉包中內層函式。由於閉包的特性,內層函式的引用最終被外層函式作為返回值丟擲,接收並處理這個返回值即可。
裝飾器的使用過程: 原有函式: 函式執行: hi(12345678) 執行結果: 1234578

裝飾過程: 使用裝飾器: a=decorator(hi) hi=a 可簡化: hi=decorator(hi) 函式執行: hi(12345678) 執行結果: start 12345678 stop 可以看到在不改變原函式在上下文呼叫的情況下,在原函式基礎上增加了功能 python中通過一個語法糖簡化以上過程,即
@decorator def hi(x):... hi(12345678)