day26:裝飾器
- 2020 年 8 月 7 日
- 筆記
- Python全棧31期-筆記
裝飾器
1.裝飾器 : 為原函數去擴展新功能,用新函數去替換舊函數
2.作用 : 在不改變原程式碼的前提下,實現功能上的擴展
3.符號 : @(語法糖)
1.裝飾器的基本用法
# 1.裝飾器的基本用法 '''裝飾器是基於閉包函數來實現的''' def kuozhan(func): def newfunc(): print("廁所前,蓬頭垢面") func() print("廁所後,精神抖擻") return newfunc def func(): print("我是宋雲傑") '''kuozhan()的返回值是newfunc,newfunc替換了func''' func = kuozhan(func) # func = newfunc '''所以調用func就是相當於在調用newfunc''' func() # newfunc()
2.@符號的使用
@符號作用:
(1) 可以自動把@符號下面的函數當成參數傳遞給裝飾器
(2) 把新函數返回,讓新函數去替換舊函數,以實現功能上的擴展(基於原函數)
# 2.@符號的使用 """ @符號作用: (1) 可以自動把@符號下面的函數當成參數傳遞給裝飾器 (2) 把新函數返回,讓新函數去替換舊函數,以實現功能上的擴展(基於原函數) """ def kuozhan(func): def newfunc(): print("廁所前,牛頭馬面") func() print("廁所後,黑白無常") return newfunc '''1.把func當做參數傳遞給裝飾器kuozhan''' '''2.將新函數newfunc返回替換舊函數func,進而實現功能的擴展''' @kuozhan def func(): print("我是高雪峰") func()
3.裝飾器的嵌套
# 3.裝飾器的嵌套 def kuozhan1(func): def newfunc(): print("廁所前,人模狗樣1") func() print("廁所後,斯文敗類2") return newfunc def kuozhan2(func): def newfunc(): print("廁所前,洗洗手3") func() print("廁所後,簌簌口4") return newfunc @kuozhan2 @kuozhan1 def func(): print("我是葛龍0") func()
4.用裝飾器擴展帶有參數的原函數
# 4.用裝飾器擴展帶有參數的原函數 def kuozhan(func): def newfunc(who,where): print("廁所前,萎靡不振") func(who,where) print("廁所後,獸性大發") return newfunc @kuozhan def func(who,where): print("{}在{}解手".format(who,where)) func("孫致和","鳥窩") # func = newfunc => func("孫致和","鳥窩") <=> newfunc("孫致和","鳥窩")