一起來(lái)看看python的裝飾器代碼
裝飾器通用模型
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è)閉包 在不改變?cè)泻瘮?shù)調(diào)用的情況下,給函數(shù)增加新的功能 """
舉個(gè)例子
#!/usr/bin/python
def admin(game):
def inner(*args, **kwargs): # inner添加了參數(shù),args 一定是個(gè)元組 kwargs 一定是字典
print('打開(kāi)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'開(kāi)始玩DNF,賬號(hào):{username},密碼:{password}')
print('刀斬肉身,心斬靈魂')
return '掉落:戮蠱的哀鳴炮'
@admin
def play_wow(race, occupation, server_name, camp):
print(f'開(kāi)始玩魔獸世界,種族:{race},職業(yè):{occupation},服務(wù)器:{server_name},陣營(yíng):{camp}')
print('為了辛多雷的榮耀')
return '掉落:灰燼使者'
if __name__ == '__main__':
ret1 = play_dnf('大馬猴', '888888')
print(ret1)
ret2 = play_wow('血精靈', '圣騎士', '回音山', '部落')
print(ret2)
這代碼還是很好懂的,我就不解釋了,然后是執(zhí)行結(jié)果
python demo.py 打開(kāi)Wg 開(kāi)始玩DNF,賬號(hào):大馬猴,密碼:888888 刀斬肉身,心斬靈魂 關(guān)閉Wg 掉落:戮蠱的哀鳴炮 打開(kāi)Wg 開(kāi)始玩魔獸世界,種族:血精靈,職業(yè):圣騎士,服務(wù)器:回音山,陣營(yíng):部落 為了辛多雷的榮耀 關(guān)閉Wg 掉落:灰燼使者 Process finished with exit code 0
一個(gè)函數(shù)被多個(gè)裝飾器裝飾,又將如何執(zhí)行呢?
#!/usr/bin/python
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
帶參數(shù)的裝飾器
裝飾器的語(yǔ)法允許我們?cè)谡{(diào)用時(shí),提供其它參數(shù),比如@decorator(a)。這樣,就為裝飾器的編寫(xiě)和使用提供了更大的靈活性。
(在上面又套了一層函數(shù))
比如,我們可以在裝飾器中指定日志的等級(jí),因?yàn)椴煌瑯I(yè)務(wù)函數(shù)可能需要的日志級(jí)別是不一樣的。
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()
類裝飾器
沒(méi)錯(cuò),裝飾器不僅可以是函數(shù),還可以是類,相比函數(shù)裝飾器,類裝飾器具有靈活度大、高內(nèi)聚、封裝性等優(yōu)點(diǎn)。使用類裝飾器主要依靠類的__call__方法,當(dāng)使用 @ 形式將裝飾器附加到函數(shù)上時(shí),就會(huì)調(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()
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
一文掌握Python爬蟲(chóng)XPath語(yǔ)法
這篇文章主要介紹了一文掌握Python爬蟲(chóng)XPath語(yǔ)法,xpath是一門(mén)在XML和HTML文檔中查找信息的語(yǔ)言,可用來(lái)在XML和HTML文檔中對(duì)元素和屬性進(jìn)行遍歷,XPath 通過(guò)使用路徑表達(dá)式來(lái)選取 XML 文檔中的節(jié)點(diǎn)或者節(jié)點(diǎn)集。下面會(huì)更學(xué)習(xí)的介紹,需要的朋友可以參考一下2021-11-11
Python用來(lái)做Web開(kāi)發(fā)的優(yōu)勢(shì)有哪些
這篇文章主要介紹了Python用來(lái)做Web開(kāi)發(fā)的優(yōu)勢(shì)有哪些,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí)Python,感興趣的朋友可以了解下2020-08-08
python使用tkinter打造三維繪圖系統(tǒng)的示例代碼
Python?的?tkinter?模塊是一個(gè)常用的?GUI(圖形用戶界面)工具包,它能夠讓你創(chuàng)建窗口應(yīng)用程序,你可以使用它來(lái)構(gòu)建用戶友好的界面,包括按鈕、標(biāo)簽、文本框、列表框等各種控件,本文講給大家介紹如何使用tkinter打造三維繪圖系統(tǒng),需要的朋友可以參考下2023-08-08
python對(duì)html代碼進(jìn)行escape編碼的方法
這篇文章主要介紹了python對(duì)html代碼進(jìn)行escape編碼的方法,涉及Python中escape方法的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05
Python最基本的數(shù)據(jù)類型以及對(duì)元組的介紹
這篇文章主要介紹了Python最基本的數(shù)據(jù)類型以及對(duì)元組的介紹,來(lái)自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下2015-04-04
在Python中關(guān)于中文編碼問(wèn)題的處理建議
這篇文章主要介紹了幾種在Python中關(guān)于中文編碼問(wèn)題的處理方法,包括在使用Unicode編碼時(shí)碰到的異常等,需要的朋友可以參考下2015-04-04
Python實(shí)現(xiàn)文本特征提取的方法詳解
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)提取四種不同文本特征的方法,有字典文本特征提取、英文文本特征提取、中文文本特征提取和TF-IDF 文本特征提取,感興趣的可以了解一下2022-08-08
Python基于隨機(jī)采樣一至性實(shí)現(xiàn)擬合橢圓(優(yōu)化版)
這篇文章主要對(duì)上一版的Python基于隨機(jī)采樣一至性實(shí)現(xiàn)擬合橢圓的優(yōu)化,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下2022-11-11
Python基礎(chǔ)篇之初識(shí)Python必看攻略
下面小編就為大家?guī)?lái)一篇Python基礎(chǔ)篇之初識(shí)Python必看攻略。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06

