作用:向原本的函式新增功能,但是不改變原函式的內部結構
在**執行期間,可以動態增加函式功能的方式,被稱為裝飾器【decorator】
也就是說,在不修改原函式的基礎上,給原函式增加功能
好處:在團隊開發中,如果兩個或者兩個以上的程式設計師會用到相同的功能,但是功能又有細微的差別,採用裝飾器:相互不影響,**簡化
# 簡單裝飾器
defout
(f):
definner()
:print
('先跳個舞'
) f(
)print
('先唱個歌'
)return inner
defsleep()
:print
('睡覺'
)# 使用裝飾器
print
('裝了裝飾器之前'
, sleep.__name__)
# 裝了裝飾器之前
sleep(
)print()
# 先把函式sleep作為引數傳遞,再將inner函式返回給sleep,sleep = inner
sleep = out(sleep)
print
('裝了裝飾器後'
, sleep.__name__)
# 裝了裝飾器後
sleep(
)# 相當於 inner()
print
('-'*50
)
import time
defout2
(f):
definner()
: s = time.time(
) f(
) e = time.time(
)# time用來計時函式執行所用的時間
print
(e - s)
return inner
# 先去呼叫函式out2,將函式inner返回給函式game, 相當於函式game => out2(game),而原本的函式game已作為引數傳遞給裝飾器函式。
@out2
defgame()
:print
('開始玩遊戲……'
)print
('玩王者榮耀……'
) time.sleep(1)
print
('玩和平精英……'
) time.sleep(2)
@out2
defgame2()
:print
('開始玩遊戲……'
)print
('玩王者榮耀……'
) time.sleep(1)
print
('玩和平精英……'
) time.sleep(2)
# 使用裝飾器向函式game新增功能
# game = out2(game) => @out2
# game2 = out2(game2) => @out2
game(
)game2(
)```python
def
outer
(f):
# eat => f
definner
(*args,
**kwargs)
:print
('before'
) f(
*args,
**kwargs)
# f(s) => eat(food)
print
('after'
)return inner
# 先呼叫outer函式,返回inner函式 eat = outer(eat) => inner
@outer
defeat
(food)
:print
('吃飯:'
, food)
'''# 如果裝飾器的引數也是和eat的引數數量一樣的話,這個eat2會報錯,引數數量不一樣,所以觸發器中inner函式要用*args, *kwargs來接收不同數量的引數
'''@outer # eat = outer(eat) => inner
defeat2
(food, food2)
:print
('吃飯:'
, food, food2)
eat(
'鴨腿'
)eat2(
'雞腿'
,'鴨腿'
)
多個裝飾器作用於同乙個函式的時候,從第乙個裝飾器開始,從上往下依次執行,但是,原函式只會被執行一次
def
outer3
(f):
definner
(*args,
**kwargs)
:print
('before 3'
) f(
*args,
**kwargs)
print
('after 3'
)return inner
defouter4
(f):
definner
(*args,
**kwargs)
:print
('before 4'
) f(
*args,
**kwargs)
print
('after 4'
)return inner
@outer3
@outer4
defdance()
:print
('跳舞'
)dance(
)# 原dance()只會執行一次
# 離這個dance函式越近的裝飾器在最內層輸出,原函式只會被執行一次
# before 3
# before 4
# 跳舞
# after 4
# after 3
來自於個人簡單的理解經驗,希望對你的學習有幫助! python裝飾器簡述
python作用域是乙個容易掉坑的地方,python 的作用域一共有 4 中,分別是 1.l 區域性作用域 2.e閉包函式,外的函式中 3.g 全域性作用域 4.b 內建作用域 以 l e g b 的規則查詢,即 在區域性找不到,便會去區域性外的區域性找 例如閉包 再找不到就會 去全域性找,再者去內...
python基礎 裝飾器
裝飾器本質就是函式,功能是為其他函式新增附加功能。原則 不修改被修飾函式的源 不修改被修飾函式的呼叫方式 裝飾器的知識儲備 裝飾器 高階函式 函式巢狀 閉包 import time 定義乙個裝飾器計算函式執行時間 def timer func start time time.time res fun...
python基礎 裝飾器
裝飾器形成的過程 最簡單的裝飾器 有返回值的 有乙個引數 萬能引數 裝飾器的作用 原則 開放封閉原則 語法糖 裝飾器的固定模式 import time print time.time 獲取當前時間 time.sleep 10 讓程式在執行到這個位置的時候停一會兒 def timmer f 裝飾器函式...