裝飾器是可呼叫物件,其引數是另乙個函式(被裝飾的函式),裝飾器可能會處理被裝飾的函式,然後把它返回,或者將其替換成另乙個函式或者可呼叫物件,例如:
def deco(func): # 1. 接收被裝飾的函式作為引數
def inner():
print('running inner()...')
return inner # 2. 返回 inner 函式,原函式被替換
# 3. 裝飾在函式上
@deco
def target():
print('running target() ...')
# 3.1 普通寫法
target_ = deco(target)
# 4. 呼叫被裝飾的 target 實際上會執行 inner
target() # running inner()...
# 4.1 這兩種寫法效果都一樣
target_() # running inner()...
# 審查物件,發現 target 和 target_ 都是 inner 的引用
print(target) # .inner at 0x106aad158>
print(target_) # .inner at 0x106aad1e0>
嚴格來講,裝飾器只是語法糖,它可以像常規的可呼叫物件那樣呼叫,其引數是另外乙個函式。
裝飾器有兩大特性:1. 能把被裝飾的函式替換成其他函式; 2. 它在被裝飾的函式定義時立即執行;
裝飾器的乙個特性是:它在被裝飾的函式定義時立即執行,通常是在匯入時執行(通常情況下,裝飾器是在另外乙個模組中);
假使裝飾器和被裝飾的函式不在同乙個模組:
from decorator import deco
print('###### the first breakpoint ######')
# 用裝飾器裝飾函式
@deco
def target():
print('running target() ...')
if __name__ == '__main__':
print('start main ------')
# 呼叫被裝飾的函式
target()
print('main end ------')
# 控制台輸出:
# ##### the first breakpoint ######
# running deco() ...
# start main ------
# main end ------
綜上,可以看出裝飾器是在被裝飾的函式定義後立即執行。 python基礎 閉包函式和裝飾器
首先我們應該知道一件事 函式的定義域跟定義位置有關係,而跟呼叫位置沒有關係。閉包函式 定義 內層函式對外層函式而非全域性變數的引用,就叫做閉包函式 閉包會一直存在在記憶體中,不會因為函式執行結束而被釋放 先看個例子 def outer num 1 definner nonlocal num num ...
18 python基礎7 閉包函式和裝飾器
在函式內部定義的函式包含對外部作用域 非全域性作用域 的引用,這樣的函式叫做閉包函式。示例 name tom deffunc name jack def bar print name return bar f func f bar f 呼叫bar 輸出結果 jack 上述 執行結果列印的是jack而...
函式裝飾器和閉包
裝飾器是可呼叫的物件,其引數是另乙個函式 被裝飾的函式 裝飾器可能會處理被裝飾的函式,然後把它返回,或者將其替換成另乙個函式或可呼叫物件。裝飾器通常把函式替換成另乙個函式 defdeco func definner print running inner return inner deco def ...