您好,登錄后才能下訂單哦!
這篇文章主要介紹python裝飾器代碼的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
def wrapper(fn): def inner(*args, **kwargs): ret = fn(*args, **kwargs) return ret return inner
裝飾器幾個(gè)關(guān)鍵點(diǎn):
1.函數(shù)可以當(dāng)參數(shù)傳遞
2.函數(shù)可以作為返回值進(jìn)行返回
3.函數(shù)名稱可以當(dāng)成變量一樣進(jìn)行賦值操作
裝飾器本質(zhì)上是個(gè)閉包,在不改變原有函數(shù)調(diào)用的情況下,給函數(shù)增加新的功能
舉個(gè)例子:
def admin(game): def inner(*args, **kwargs): # inner添加了參數(shù),args 一定是個(gè)元組 kwargs 一定是字典 print('打開Wg') result = game(*args, **kwargs) # * ** 表示把a(bǔ)rgs元組和kwargs打散成位置參數(shù),關(guān)鍵字參數(shù)傳遞進(jìn)去 print('關(guān)閉Wg') return result return inner @admin def play_dnf(username, password): print(f'開始玩DNF,賬號:{username},密碼:{password}') print('刀斬肉身,心斬靈魂') return '掉落:戮蠱的哀鳴炮' @admin def play_wow(race, occupation, server_name, camp): print(f'開始玩魔獸世界,種族:{race},職業(yè):{occupation},服務(wù)器:{server_name},陣營:{camp}') print('為了辛多雷的榮耀') return '掉落:灰燼使者' if __name__ == '__main__': ret1 = play_dnf('大馬猴', '888888') print(ret1) ret2 = play_wow('血精靈', '圣騎士', '回音山', '部落') print(ret2)
這代碼還是很好懂的,我就不解釋了,然后是執(zhí)行結(jié)果如下:
python demo.py
打開Wg
開始玩DNF,賬號:大馬猴,密碼:888888
刀斬肉身,心斬靈魂
關(guān)閉Wg
掉落:戮蠱的哀鳴炮
打開Wg
開始玩魔獸世界,種族:血精靈,職業(yè):圣騎士,服務(wù)器:回音山,陣營:部落
為了辛多雷的榮耀
關(guān)閉Wg
掉落:灰燼使者Process finished with exit code 0
一個(gè)函數(shù)被多個(gè)裝飾器裝飾,又將如何執(zhí)行呢?
def wrapper1(fn): def inner(*args, **kwargs): print('這是w1進(jìn)入') ret = fn(*args, **kwargs) print('這是w1出去') return ret return inner def wrapper2(fn): def inner(*args, **kwargs): print('這是w2進(jìn)入') ret = fn(*args, **kwargs) print('這是w2出去') return ret return inner @wrapper1 @wrapper2 def target(): print('我是目標(biāo)') if __name__ == '__main__': target()
直接給出執(zhí)行順序:
一個(gè)函數(shù)被多個(gè)裝飾器裝飾的執(zhí)行順序
# w1 w2 target w2 w1
裝飾器的語法允許我們在調(diào)用時(shí),提供其它參數(shù),比如@decorator(a)。這樣,就為裝飾器的編寫和使用提供了更大的靈活性。
(在上面又套了一層函數(shù))
比如,我們可以在裝飾器中指定日志的等級,因?yàn)椴煌瑯I(yè)務(wù)函數(shù)可能需要的日志級別是不一樣的。
def use_logging(level): def decorator(func): def wrapper(*args, **kwargs): if level == "warn": logging.warn("%s is running" % func.__name__) elif level == "info": logging.info("%s is running" % func.__name__) return func(*args) return wrapper return decorator @use_logging(level="warn") def foo(name='foo'): print("i am %s" % name) foo()
沒錯(cuò),裝飾器不僅可以是函數(shù),還可以是類,相比函數(shù)裝飾器,類裝飾器具有靈活度大、高內(nèi)聚、封裝性等優(yōu)點(diǎn)。使用類裝飾器主要依靠類的__call__
方法,當(dāng)使用 @ 形式將裝飾器附加到函數(shù)上時(shí),就會調(diào)用此方法。
class Foo(object): def __init__(self, func): self._func = func def __call__(self): print ('class decorator runing') self._func() print ('class decorator ending') @Foo def bar(): print ('bar') bar()
以上是“python裝飾器代碼的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。