91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python裝飾器代碼的示例分析

發布時間:2022-03-23 14:04:55 來源:億速云 閱讀:133 作者:小新 欄目:開發技術

這篇文章主要介紹python裝飾器代碼的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

1.裝飾器通用模型

def wrapper(fn):
    def inner(*args, **kwargs):
        ret = fn(*args, **kwargs)
        return ret

    return inner

裝飾器幾個關鍵點:

  • 1.函數可以當參數傳遞

  • 2.函數可以作為返回值進行返回

  • 3.函數名稱可以當成變量一樣進行賦值操作

裝飾器本質上是個閉包,在不改變原有函數調用的情況下,給函數增加新的功能

舉個例子:

def admin(game):
    def inner(*args, **kwargs):  # inner添加了參數,args 一定是個元組 kwargs 一定是字典
        print('打開Wg')
        result = game(*args, **kwargs)  # * ** 表示把args元組和kwargs打散成位置參數,關鍵字參數傳遞進去
        print('關閉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},職業:{occupation},服務器:{server_name},陣營:{camp}')
    print('為了辛多雷的榮耀')
    return '掉落:灰燼使者'


if __name__ == '__main__':
    ret1 = play_dnf('大馬猴', '888888')
    print(ret1)
    ret2 = play_wow('血精靈', '圣騎士', '回音山', '部落')
    print(ret2)

這代碼還是很好懂的,我就不解釋了,然后是執行結果如下:

python demo.py
打開Wg
開始玩DNF,賬號:大馬猴,密碼:888888
刀斬肉身,心斬靈魂
關閉Wg
掉落:戮蠱的哀鳴炮
打開Wg
開始玩魔獸世界,種族:血精靈,職業:圣騎士,服務器:回音山,陣營:部落
為了辛多雷的榮耀
關閉Wg
掉落:灰燼使者

Process finished with exit code 0

2.多個裝飾器裝飾的函數執行

一個函數被多個裝飾器裝飾,又將如何執行呢?

def wrapper1(fn):
    def inner(*args, **kwargs):
        print('這是w1進入')
        ret = fn(*args, **kwargs)
        print('這是w1出去')
        return ret

    return inner


def wrapper2(fn):
    def inner(*args, **kwargs):
        print('這是w2進入')
        ret = fn(*args, **kwargs)
        print('這是w2出去')
        return ret

    return inner


@wrapper1
@wrapper2
def target():
    print('我是目標')


if __name__ == '__main__':
    target()

直接給出執行順序:

一個函數被多個裝飾器裝飾的執行順序

# w1 w2 target w2 w1

3.帶參數的裝飾器

裝飾器的語法允許我們在調用時,提供其它參數,比如@decorator(a)。這樣,就為裝飾器的編寫和使用提供了更大的靈活性。
(在上面又套了一層函數)
比如,我們可以在裝飾器中指定日志的等級,因為不同業務函數可能需要的日志級別是不一樣的。

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()

4.類裝飾器

沒錯,裝飾器不僅可以是函數,還可以是類,相比函數裝飾器,類裝飾器具有靈活度大、高內聚、封裝性等優點。使用類裝飾器主要依靠類的__call__方法,當使用 @ 形式將裝飾器附加到函數上時,就會調用此方法。

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裝飾器代碼的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

读书| 阿拉尔市| 洮南市| 含山县| 岳西县| 抚顺市| 陈巴尔虎旗| 通化市| 册亨县| 勃利县| 阿合奇县| 大悟县| 襄垣县| 青神县| 奉新县| 怀远县| 荣昌县| 夏河县| 南康市| 石棉县| 前郭尔| 齐齐哈尔市| 贺州市| 韩城市| 临泽县| 克拉玛依市| 邢台市| 涿州市| 行唐县| 青河县| 广安市| 肥东县| 抚顺县| 平塘县| 儋州市| 佳木斯市| 安多县| 吉水县| 彭州市| 扎赉特旗| 雅安市|