最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一起來(lái)看看python的裝飾器代碼

 更新時(shí)間:2022年03月24日 16:03:31   作者:低調(diào)說(shuō)  
這篇文章主要為大家詳細(xì)介紹了python裝飾器代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

裝飾器通用模型

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使用thrift教程的方法示例

    python使用thrift教程的方法示例

    這篇文章主要介紹了python使用thrift教程的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Python中base64編碼與解碼詳解

    Python中base64編碼與解碼詳解

    本文主要介紹了Python2和Python3中使用base64加密方式的區(qū)別,Python3中字符為unicode編碼,而b64encode函數(shù)的參數(shù)為byte類型,所以需要先進(jìn)行轉(zhuǎn)碼
    2024-11-11
  • Python自動(dòng)化辦公之創(chuàng)建PPT文件

    Python自動(dòng)化辦公之創(chuàng)建PPT文件

    python-pptx模塊是Python中用于PPT操作的模塊。本文將利用這一模塊實(shí)現(xiàn)創(chuàng)建PPT文件。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-05-05
  • Python實(shí)現(xiàn)系統(tǒng)交互(subprocess)

    Python實(shí)現(xiàn)系統(tǒng)交互(subprocess)

    我們幾乎可以在任何操作系統(tǒng)上通過(guò)命令行指令與操作系統(tǒng)進(jìn)行交互,本文實(shí)現(xiàn)了Python系統(tǒng)交互,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-07-07
  • 解決pymongo連接數(shù)據(jù)庫(kù)報(bào)錯(cuò)certificate verify failed:certificate has expired

    解決pymongo連接數(shù)據(jù)庫(kù)報(bào)錯(cuò)certificate verify failed:certific

    這篇文章主要介紹了解決pymongo連接數(shù)據(jù)庫(kù)報(bào)錯(cuò)certificate verify failed:certificate has expired問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 使用50行Python代碼從零開(kāi)始實(shí)現(xiàn)一個(gè)AI平衡小游戲

    使用50行Python代碼從零開(kāi)始實(shí)現(xiàn)一個(gè)AI平衡小游戲

    本文會(huì)為大家展示機(jī)器學(xué)習(xí)專家 Mike Shi 如何用 50 行 Python 代碼創(chuàng)建一個(gè) AI,使用增強(qiáng)學(xué)習(xí)技術(shù),玩耍一個(gè)保持桿子平衡的小游戲。本文給大家?guī)?lái)實(shí)現(xiàn)思路及簡(jiǎn)單代碼,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • Python3實(shí)現(xiàn)二叉樹(shù)的最大深度

    Python3實(shí)現(xiàn)二叉樹(shù)的最大深度

    這篇文章主要介紹了Python3實(shí)現(xiàn)二叉樹(shù)的最大深度, 文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 利用Python制作自已的動(dòng)態(tài)屏保

    利用Python制作自已的動(dòng)態(tài)屏保

    這篇文章主要為大家詳細(xì)介紹了如何利用Python制作自已的動(dòng)態(tài)屏保,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,需要的可以參考一下
    2022-12-12
  • 對(duì)python 生成拼接xml報(bào)文的示例詳解

    對(duì)python 生成拼接xml報(bào)文的示例詳解

    今天小編就為大家分享一篇對(duì)python 生成拼接xml報(bào)文的示例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Python數(shù)據(jù)結(jié)構(gòu)與算法中的隊(duì)列詳解(1)

    Python數(shù)據(jù)結(jié)構(gòu)與算法中的隊(duì)列詳解(1)

    這篇文章主要為大家詳細(xì)介紹了Python的隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03

最新評(píng)論

青神县| 六枝特区| 五常市| 安顺市| 民县| 新乡市| 星子县| 景泰县| 和田市| 武威市| 和静县| 葫芦岛市| 饶平县| 石泉县| 萨迦县| 诸城市| 萨嘎县| 故城县| 东至县| 峨眉山市| 大荔县| 临沂市| 南安市| 甘谷县| 大新县| 柘荣县| 民乐县| 盖州市| 新平| 双辽市| 万山特区| 抚松县| 新昌县| 突泉县| 商水县| 九龙城区| 从江县| 卢湾区| 威宁| 龙井市| 雷州市|