有時候我們可能會有些需要,要求在不改變原函式的情況下給函式增加功能,這個時候裝飾器就派上了用場。
要理解裝飾器需要先理解什麼是閉包。
定義:在函式巢狀的前提下,內部函式使用了外部函式的變數,並且外部函式返回了內部函式,我們把這個使用外部函式變數的內部函式稱為閉包。
舉乙個栗子:
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 修改外層函式的值,並且內部函...