您好,登錄后才能下訂單哦!
這篇文章主要講解了“python的裝飾器怎么用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“python的裝飾器怎么用”吧!
1、實現a+b的功能
def A(a, b): print(a + b) return a + bif __name__ == "__main__": A(1, 2)
2、現在我想函數A不變的情況下,實現a+2+b*2的功能 -- 函數帶參數或者參數數量不確定
def B(fun): def C(*args): a = args[0]+2 b = args[1]*2 return fun(a,b) return C@Bdef A(a, b): print(a + b) return a + bif __name__ == "__main__": A(1, 2) 輸出結果:7
(1)在main函數運行A(1,2)時,先進入裝飾器B中,并將a/b參數傳給*args(這里args可表示不限數量的變量輸入);在對參數a/b進行修改后,最后進入A函數進行 計算。
(2)函數B的入參是 fun,函數C的入參是 args,對應的實際值即為A(),(a,b)
3、在添加裝飾器后,又想繼續使用原函數功能 -- 裝飾器帶參數
def D(flag):
def B(fun):
def C(*args):
if flag:
a = args[0]+2
b = args[1]*2
return fun(a, b)
else:
return fun(*args)
return C
return B
@D(flag=False)
def A(a, b):
print(a + b)
return a + b
if __name__ == "__main__":
A(1, 2)
輸出結果:3
通過flag字段的判斷,可以實現A()原功能或者A的增加功能。
這里要注意下,在原裝飾器B函數外面又加了一層函數D,為 了加深印象,可 以這樣理解:
D是為 了flag參數的,B是為了A()的,C是為了a/b參數的。對應的順序是基于flag/A/ab的上下文決定。
4、在寫完函數D后,發現又想 加新功能,怎么辦? -- 裝飾器疊羅漢。
# coding=utf-8
# @Auther : "鵬哥賊優秀"
# @Date : 2019/10/24
# @Software : PyCharm
def D(flag):
def B(fun):
def C(*args):
print("我是D 裝飾器")
print("當前輸入值內容變為:", *args)
if flag:
a = args[0] + 2
b = args[1] * 2
return fun(a, b)
else:
return fun(*args)
return C
return B
def E(fun):
def F(*args):
print("我是E 裝飾器")
print("當前輸入值內容變為:",*args)
a = args[0] + 10
b = args[1] + 10
return fun(a, b)
return F
@D(flag=True)
@E
def A(a, b):
print(a + b)
return a + b
if __name__ == "__main__":
A(1, 2)
輸出結果是:
我是D 裝飾器
當前輸入值內容變為:1 2
我是E 裝飾器
當前輸入值內容變為:3 4
27
當出現多個裝飾器,按順序分別進行對應功能的計算,因此根據以上示例代碼,先進行裝飾器D的計算,將a/b變為3/4;然后進入裝飾器E的計算,將a/b變為了13/14,最后進入A()函數,并輸出27。
感謝各位的閱讀,以上就是“python的裝飾器怎么用”的內容了,經過本文的學習后,相信大家對python的裝飾器怎么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。