Python學習筆記之裝飾器原理
阿新 • • 發佈:2018-09-29
開放 直接 蘋果 def 復用 學習 clas bsp pytho
1 def decorator(fn): 2 def wrapper(): 3 print("詢價") 4 fn() 5 print("購買成功!") 6 7 return wrapper 8 9 10 def apple(): 11 print("購買蘋果") 12 13 14 def orange(): 15 print("購買橘子") 16 17 18 def potato(): 19 print("購買土豆") 20 21 22 ap = decorator(apple)23 ap() 24 25 ora = decorator(orange) 26 ora() 27 28 po = decorator(potato) 29 po()
運行結果
(1) 裝飾器相當於使用閉包函數封裝公共部分的函數:
在decorator函數中, 定義一個閉包函數 wrapper, 而wrapper函數內部除了輸出公共部分print("詢價") print("購買成功!")
(2) decorator裝飾器傳入形參fn作為函數返回
參數fn傳入裝飾器後, 在閉包函數內部作為函數調用fn()
切記: wrapper作為閉包函數,必須返回
(3) 自定義不同函數 apple, orange, potato ...,作為實參傳入裝飾器
2 . 賦值給變量
ap = decorator(apple)
1 . 調用
ap()
(4)修改
直接在函數上方使用@decorator就可以調用裝飾器,無需再將賦值給變量
調用函數即可
1 def decorator(fn): 2 def wrapper(): 3 print("詢價") 4 fn() 5 print("購買成功!") 6 7 returnwrapper 8 9 10 @decorator 11 def apple(): 12 print("購買蘋果") 13 14 15 @decorator 16 def orange(): 17 print("購買橘子") 18 19 20 @decorator 21 def potato(): 22 print("購買土豆") 23 24 # ap = decorator(apple) 25 # ap() 26 # 27 # ora = decorator(orange) 28 # ora() 29 # 30 # po = decorator(potato) 31 # po() 32 apple() 33 orange() 34 potato()
(5)總結
裝飾器的作用其實就是封裝復用的代碼,並且可以將新增的公共代碼寫在裝飾器中,避免了在函數內部擴展代碼。秉承了函數的封閉性和開放性,即對修改是封閉的,對擴展是開放的
Python學習筆記之裝飾器原理