裝飾器的本質:一個閉包函數閉包
裝飾器的功能:在不修改原函數及其調用方式的狀況下對原函數的功能鏡像擴展app
語法糖:ide
1 import time 2 def timer(func): 3 def inner(): 4 start = time.time() 5 func() 6 print(time.time() - start) 7 return inner 8 @timer #==> func1 = timer(func1) ===>語法糖 9 def func1(): 10 print('in func1') 11 func1() 12 13 裝飾器——語法糖
開放封閉原則:對擴展開放,對修改封閉函數
1.對擴展是開放的 爲何要對擴展開放呢? 咱們說,任何一個程序,不可能在設計之初就已經想好了全部的功能而且將來不作任何更新和修改。因此咱們必須容許代碼擴展、添加新功能。 2.對修改是封閉的 爲何要對修改封閉呢? 就像咱們剛剛提到的,由於咱們寫的一個函數,頗有可能已經交付給其餘人使用了,若是這個時候咱們對其進行了修改,頗有可能影響其餘已經在使用該函數的用戶。 裝飾器完美的遵循了這個開放封閉原則。 裝飾器的主要功能和固定格式: 功能:在不改變函數的調用方式的基礎上在函數先後添加某些功能
固定格式:spa
1 def timer(func): 2 def inner(*args,**kwargs): 3 '''執行函數以前要作的''' 4 re = func(*args,**kwargs) 5 '''執行函數以後要作的''' 6 return re 7 return inner
帶參數的裝飾器:設計
1 def outer(flag): 2 def timer(func): 3 def inner(*args,**kwargs): 4 if flag: 5 print('''執行函數以前要作的''') 6 re = func(*args,**kwargs) 7 if flag: 8 print('''執行函數以後要作的''') 9 return re 10 return inner 11 return timer 12 @outer(False) 13 def func(): 14 print(111) 15 func()
多個裝飾器修飾同一個函數:3d
1 def wrapper1(func): 2 def inner(): 3 print('wrapper1 ,before func') 4 func() 5 print('wrapper1 ,after func') 6 return inner 7 def wrapper2(func): 8 def inner(): 9 print('wrapper2 ,before func') 10 func() 11 print('wrapper2 ,after func') 12 return inner 13 @wrapper2 14 @wrapper1 15 def f(): 16 print('in f') 17 f()