Python中帶參數的裝飾器


裝飾器本身是用來是為一個函數是實現新的功能,並且不改變原函數的代碼以及調用方式。

遇到這樣一種問題:

眾多函數調用了你寫的裝飾器,但客戶有需求說,我想實現我可以隨之控制裝飾器是否生效。

那你就不可能在得到命令的時候去原函數頭部去做刪除和添加裝飾器調用的命令。這是就可以用到帶參數的裝飾器,定義一個開關,調用裝飾器的時候,把這個裝飾器的開關參數給傳遞進去,這樣當開關打開的時候裝飾器生效,關閉的時候則只執行原函數的代碼。

 

舉例:開關參數為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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM