python 裝飾器詳解與應(yīng)用范例
什么是裝飾器
從字面意思上來看,裝飾器是用來裝飾其他東西的工具。在python中裝飾器分為函數(shù)裝飾器和類裝飾器。
簡(jiǎn)而言之,函數(shù)裝飾器是用來裝飾函數(shù)的裝飾器,其主要目的是增加目標(biāo)函數(shù)的功能,類裝飾器也就是裝飾類的裝飾器,增加類的功能。
函數(shù)裝飾器
裝飾器本質(zhì)是嵌套函數(shù)
下面是一個(gè)簡(jiǎn)單的裝飾器
# fun1為裝飾器名稱,function指的是被裝飾的函數(shù) def fun1(function): def fun2(): print("開始了!") function() # 執(zhí)行被裝飾的函數(shù)或者 或者 return function() return fun2
外面的fun1()
需要傳入一個(gè)參數(shù),這個(gè)參數(shù)是用來傳入要被裝飾的函數(shù),里面的fun2()
需要執(zhí)行function
這個(gè)參數(shù)。
這是將函數(shù)當(dāng)成參數(shù)傳入另一個(gè)函數(shù)。
使用方法:
在需要裝飾的函數(shù)上添加@裝飾器名稱
@fun1 def fun3(): print("aaa") fun3()
可以等價(jià)成這樣:
def fun3(): print("aaa") fun = fun1(fun3) fun()
輸出結(jié)果是一致的
執(zhí)行結(jié)果:
開始了!
aaa
如果傳入的函數(shù)需要參數(shù)可以這樣寫:
def fun1(function): def fun2(a): print("開始了!") function(a) return fun2 @fun1 def fun3(a): print(a) fun3("aaa")
輸出結(jié)果:
開始了!
aaa
如果不清楚傳入的函數(shù)需要多少個(gè)參數(shù),可以這樣寫:
def fun1(function): def fun2(*args, **kwargs): print("開始了!") function(*args, **kwargs) return fun2 @fun1 def fun3(a,b): print(a,b) @fun1 def fun4(a,b,c): print(a,b,c) fun3("aaa","bbb") fun4("ccc","ddd","eee")
運(yùn)行結(jié)果:
開始了!
aaa bbb
開始了!
ccc ddd eee
如果函數(shù)裝飾器需要添加參數(shù),可以這樣寫:
def fun(msg): def fun1(function): def fun2(*args, **kwargs): print("開始了!{}".format(msg)) function(*args, **kwargs) return fun2 return fun1 @fun(msg="小朋友") def fun3(a,b): print(a,b) fun3("aaa","bbb")
運(yùn)行結(jié)果:
開始了!小朋友
aaa bbb
類裝飾器
類裝飾器的用法基本和函數(shù)裝飾器一樣,只不過是用類寫的裝飾器
class fun1(object): def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print(("開始了!") self.func(*args, **kwargs) @fun1 def fun2(a,b): print(a,b) fun2("aaa","bbb")
類裝飾用到了類的__call__
方法
運(yùn)行結(jié)果:
開始了!
aaa bbb
還可以這樣寫:
class fun(object): def __init__(self, msg): self.msg = msg def __call__(self, func): def fun1(*args, **kwargs): print("開始了!{0}".format(self.msg)) func(*args, **kwargs) return fun1 @fun(msg="小朋友") def fun2(a, b): print(a, b) fun2("aaa,","bbb")
運(yùn)行結(jié)果:
開始了!小朋友
aaa, bbb
到此這篇關(guān)于python 裝飾器詳解與應(yīng)用范例的文章就介紹到這了,更多相關(guān)python 裝飾器內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。