1. 程式人生 > >Python學習筆記之裝飾器原理

Python學習筆記之裝飾器原理

開放 直接 蘋果 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     return
wrapper 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學習筆記之裝飾器原理