python中的裝飾器(Decorators)

一、什麼是python裝飾器(Decorators)

定義:python的裝飾器:裝飾原有的函數,用於拓展原來函數功能的一種函數,在不更改原來函數代碼的基礎上,增加函數的功能。
格式:@ 符號就是裝飾器的語法糖,它放在函數開始定義的地方,這樣就可以省略最後一步再次賦值的操作。

二 、裝飾器返回值及用處

裝飾器的返回值也是一個函數/類對象。它經常用於有切面需求的場景,比如:插入日誌、性能測試、事務處理、緩存、權限校驗等場景,裝飾器是解決這類問題的絕佳設計。
裝飾器的具體詳解可學習此鏈接

三、用法:

1、函數裝飾器

用@函數名,裝飾器可以嵌套函數,分爲裝飾器帶參數和不帶參數的。用法可參照以下代碼使用。
代碼引用自:

def demo1(demo_name):
    def wrapper(fun):
        print(demo_name, "wrapper")
        fun()
    # end def

    @wrapper
    def test():
        print(demo_name, "test")
    # end def

    test  # 調用test方法,此處不能加()。
# end def(demo)


def demo2(demo_name):  #可以創建嵌套的函數,函數也能返回函數
    def wrapper(func):
        def callback(*args, **kwargs):
            print(demo_name, "callback")
            return func(*args, **kwargs)
        return callback
    # end def

    @wrapper
    def test(item):
        print(demo_name, "test", item)
    # end def

    test("Hello")  # 調用test方法
# end def(demo)


def demo3(demo_name):
    def decorate(tip):
        def wrapper(func):
            def callback(*args, **kwargs):
                print(demo_name, tip)
                return func(*args, **kwargs)
            return callback
        return wrapper
    # end def(decorate)

    @decorate("Something")  # 帶參數的裝飾器
    def test(item):
        print(demo_name, "test", item)
    # end def

    test("Hello")  # 調用test方法
# end def(demo)


if __name__ == '__main__':
    demo1("demo1")
    print()

    # 被裝飾函數傳參
    demo2("demo2")
    print()

    # 裝飾器傳參
    demo3("demo3")
    print()

2、類裝飾器:

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()
functools.wraps

代碼引用自:

四、裝飾器的執行順序:

一個函數還可以同時定義多個裝飾器,從內向外的調用,執行順序是從裏到外,最先調用最裏層的裝飾器,最後調用最外層的裝飾器

@a
@b
@c
def f ():
    pass
等價於:
f = a(b(c(f)))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章