快速學會 python閉包和裝飾器

2021-10-07 14:52:00 字數 1576 閱讀 8742

有時候我們可能會有些需要,要求在不改變原函式的情況下給函式增加功能,這個時候裝飾器就派上了用場。

要理解裝飾器需要先理解什麼是閉包

定義:在函式巢狀的前提下,內部函式使用了外部函式的變數,並且外部函式返回了內部函式,我們把這個使用外部函式變數的內部函式稱為閉包。

舉乙個栗子:

def

f_outer

(str1)

:def

f_inner

(str2)

:print

('同桌拿了我的%s,我%s了'

%(str1, str2)

)return f_inner

#建立閉包

f = f_outer(

'秘製小漢堡')f(

'笑')

輸出:

在此我們可以看到閉包的特點

函式巢狀

內部函式使用了外部函式的變數(還包括外部函式的引數)

外部函式返回了內部函式

在此我們還可以看出閉包的作用

儲存函式的引數和區域性變數(這裡沒有寫,大家可以自己試一下)

說到了裝飾器,我們需要知道裝飾器的本質就是乙個閉包

舉第二個栗子:

def

decorator

(func)

:print

('裝飾器啟動!'

)def

inner()

: func(

)print

('愛你傲'

)return inner

defwisher()

:print

('三天之內心想事成'

)wisher = decorator(wisher)

#此時wisher已經等於inner了

wisher(

)

輸出:

實際使用的時候我們可以使用語法糖,方便呼叫

def

decorator

(func)

:print

('裝飾器啟動!'

)def

inner()

: func(

)print

('愛你傲'

)return inner

@decorator

defwisher()

:print

('三天之內心想事成'

)wisher(

)

接下來我們梳理一下裝飾器的執行過程,以便更好的理解和記憶

在執行wisher()時,因為之前語法糖的緣故

實際執行語句

wisher = decorator(wisher)

wisher(

)

python裝飾器和閉包

下面幾個部落格有裝飾器的講解,也包含了裝飾器幾種情況的例子,比如說被裝飾的函式帶引數,裝飾器本身帶引數等。理解python中的裝飾器 python裝飾器學習 例子 其實裝飾器跟設計模式中的裝飾器模式基本一樣,就是在已有的函式上新增新的功能,這也是自己對裝飾器的一點簡陋的理解了。下面是自己寫的簡單例子...

python閉包和裝飾器

要理解裝飾器,就要明白閉包 要明白閉包,首先就要從高階函式和作用域說起 說道作用域,一般會談到legb規則。所謂的legb l locals,當前命名空間 區域性作用域 e enclosing,外部函式的命名空間 外部作用域 g global,全域性的命名空間 b bulit in,內建的命名空間平...

python 閉包和裝飾器

閉包的寫法,兩層函式的巢狀,外部函式返回內部函式的引用,外層函式都帶引數 def 外層函式的名稱 引數 def 內層函式的名稱 pass return 內層函式的引用 def set fun func func 254 defcall fun nonlocal func 修改外層函式的值,並且內部函...