python 裝飾器詳解與應(yīng)用范例
什么是裝飾器
從字面意思上來(lái)看,裝飾器是用來(lái)裝飾其他東西的工具。在python中裝飾器分為函數(shù)裝飾器和類(lèi)裝飾器。
簡(jiǎn)而言之,函數(shù)裝飾器是用來(lái)裝飾函數(shù)的裝飾器,其主要目的是增加目標(biāo)函數(shù)的功能,類(lèi)裝飾器也就是裝飾類(lèi)的裝飾器,增加類(lèi)的功能。
函數(shù)裝飾器
裝飾器本質(zhì)是嵌套函數(shù)
下面是一個(gè)簡(jiǎn)單的裝飾器
# fun1為裝飾器名稱(chēng),function指的是被裝飾的函數(shù)
def fun1(function):
def fun2():
print("開(kāi)始了!")
function() # 執(zhí)行被裝飾的函數(shù)或者 或者 return function()
return fun2
外面的fun1()需要傳入一個(gè)參數(shù),這個(gè)參數(shù)是用來(lái)傳入要被裝飾的函數(shù),里面的fun2()需要執(zhí)行function這個(gè)參數(shù)。
這是將函數(shù)當(dāng)成參數(shù)傳入另一個(gè)函數(shù)。
使用方法:
在需要裝飾的函數(shù)上添加@裝飾器名稱(chēng)
@fun1
def fun3():
print("aaa")
fun3()
可以等價(jià)成這樣:
def fun3():
print("aaa")
fun = fun1(fun3)
fun()
輸出結(jié)果是一致的
執(zhí)行結(jié)果:
開(kāi)始了!
aaa
如果傳入的函數(shù)需要參數(shù)可以這樣寫(xiě):
def fun1(function):
def fun2(a):
print("開(kāi)始了!")
function(a)
return fun2
@fun1
def fun3(a):
print(a)
fun3("aaa")
輸出結(jié)果:
開(kāi)始了!
aaa
如果不清楚傳入的函數(shù)需要多少個(gè)參數(shù),可以這樣寫(xiě):
def fun1(function):
def fun2(*args, **kwargs):
print("開(kāi)始了!")
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é)果:
開(kāi)始了!
aaa bbb
開(kāi)始了!
ccc ddd eee
如果函數(shù)裝飾器需要添加參數(shù),可以這樣寫(xiě):
def fun(msg):
def fun1(function):
def fun2(*args, **kwargs):
print("開(kāi)始了!{}".format(msg))
function(*args, **kwargs)
return fun2
return fun1
@fun(msg="小朋友")
def fun3(a,b):
print(a,b)
fun3("aaa","bbb")
運(yùn)行結(jié)果:
開(kāi)始了!小朋友
aaa bbb
類(lèi)裝飾器
類(lèi)裝飾器的用法基本和函數(shù)裝飾器一樣,只不過(guò)是用類(lèi)寫(xiě)的裝飾器
class fun1(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print(("開(kāi)始了!")
self.func(*args, **kwargs)
@fun1
def fun2(a,b):
print(a,b)
fun2("aaa","bbb")
類(lèi)裝飾用到了類(lèi)的__call__方法
運(yùn)行結(jié)果:
開(kāi)始了!
aaa bbb
還可以這樣寫(xiě):
class fun(object):
def __init__(self, msg):
self.msg = msg
def __call__(self, func):
def fun1(*args, **kwargs):
print("開(kāi)始了!{0}".format(self.msg))
func(*args, **kwargs)
return fun1
@fun(msg="小朋友")
def fun2(a, b):
print(a, b)
fun2("aaa,","bbb")
運(yùn)行結(jié)果:
開(kāi)始了!小朋友
aaa, bbb
到此這篇關(guān)于python 裝飾器詳解與應(yīng)用范例的文章就介紹到這了,更多相關(guān)python 裝飾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pyqt5設(shè)置返回鍵和跳轉(zhuǎn)頁(yè)面鍵的示例代碼
這篇文章主要介紹了Pyqt5設(shè)置返回鍵和跳轉(zhuǎn)頁(yè)面鍵的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
一文帶你掌握Python中enumerate函數(shù)和for循環(huán)的對(duì)比
在Python編程中,循環(huán)是一項(xiàng)常見(jiàn)的任務(wù),而for循環(huán)是最常見(jiàn)的一種,然而,Python提供了enumerate函數(shù),它允許在迭代過(guò)程中訪問(wèn)元素的同時(shí)獲得它們的索引,下面我們就來(lái)學(xué)習(xí)一下二者的區(qū)別吧2023-11-11
python學(xué)生信息管理系統(tǒng)(完整版)
這篇文章主要為大家詳細(xì)介紹了python學(xué)生信息管理系統(tǒng)的完整版本代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
在Python的while循環(huán)中使用else以及循環(huán)嵌套的用法
這篇文章主要介紹了在Python的while循環(huán)中使用else以及循環(huán)嵌套的用法,是Python入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10
python orm 框架中sqlalchemy用法實(shí)例詳解
這篇文章主要介紹了python orm 框架中sqlalchemy用法,結(jié)合實(shí)例形式詳細(xì)分析了Python orm 框架基本概念、原理及sqlalchemy相關(guān)使用技巧,需要的朋友可以參考下2020-02-02

