第7章 函式裝飾器和閉包 基礎知識和裝飾器執行時機

2021-10-08 14:50:34 字數 1353 閱讀 8506

裝飾器是可呼叫物件,其引數是另乙個函式(被裝飾的函式),裝飾器可能會處理被裝飾的函式,然後把它返回,或者將其替換成另乙個函式或者可呼叫物件,例如:

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 ...