裝飾器
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("孫致和","鳥窩")