裝飾器本身是用來是為一個函數是實現新的功能,並且不改變原函數的代碼以及調用方式。
遇到這樣一種問題:
眾多函數調用了你寫的裝飾器,但客戶有需求說,我想實現我可以隨之控制裝飾器是否生效。
那你就不可能在得到命令的時候去原函數頭部去做刪除和添加裝飾器調用的命令。這是就可以用到帶參數的裝飾器,定義一個開關,調用裝飾器的時候,把這個裝飾器的開關參數給傳遞進去,這樣當開關打開的時候裝飾器生效,關閉的時候則只執行原函數的代碼。
舉例:開關參數為True的時候執行過程:
1 F = True #step 1 裝飾器的開關變量 2 def outer(flag): #step 2 3 def wrapper(func): #step 4 4 def inner(*args,**kwargs): #stpe 6 5 if flag: #step 9 6 print('before') #step 10 7 ret = func(*args,**kwargs) #step 11 執行原函數 8 print('after') #step13 9 else: 10 ret = func(*args,**kwargs) 11 print('123') 12 return ret #step 14 13 return inner #step 7 14 return wrapper #step 5 15 16 @outer(F) #先執行step 3 :outer(True)這個函數,然后step 6:@wrapper #此處把開關參數傳遞給裝飾器函數 17 def hahaha(): 18 pass #step 12 19 hahaha() # step 8 相當於inner()
開關參數為False的時候執行過程:
1 F = False #stpe1 裝飾器的開關變量 2 def outer(flag): #step 2 3 def wrapper(func): #step 4 4 def inner(*args,**kwargs): #stpe 6 5 if flag: #step 9 6 print('before') 7 ret = func(*args,**kwargs) 8 print('after') 9 else: 10 ret = func(*args,**kwargs) #step 10 執行原函數 11 print('123') #step 12 12 return ret #step 13 13 return inner #step 7 14 return wrapper #step 5