Python 裝飾器備忘

def deco(attr):
    ''' 裝飾器,共包含三層返回結構 \n
        第一層:用於接收 @deco 的參數,此處的代碼只在初始化裝飾器時執行一次 \n
        第二層:用於接收 function,此處的代碼只在初始化裝飾器時執行一次 \n
        第三層:用於接收 function 的參數,並將做爲最終被執行與返回的裝飾結果 \n
    '''
    def _deco(f):
        '''第二層:用於接收 function,此處的代碼只在初始化裝飾器時執行一次
        '''
        print('只在裝飾函數時,執行一次,此時裝飾函數', f.__name__)

        def __deco(a, b):
            '''第三層:用於接收 function 的參數,並將做爲最終被執行與返回的裝飾結果
            '''
            print('before run attr: ' + attr + '; a: ' + a + '; b: ' + b)
            # 此處必須調用 function,否則裝飾器執行事後,就不會再執行 function 的函數體
            f(a, b)
            print('after  run attr: ' + attr + '; a: ' + a + '; b: ' + b)

        return __deco
    return _deco


@deco('hello')
def hello(a, b):
    print('hello, ' + a + b)


@deco('world')
def world(a, b):
    print('world, ' + a + b)


hello('a', 'b')
world('A', 'B')


# 執行結果:
# 
# 只在裝飾函數時,執行一次,此時裝飾函數 hello
# 只在裝飾函數時,執行一次,此時裝飾函數 world
# before run attr: hello; a: a; b: b
# hello, ab
# after  run attr: hello; a: a; b: b
# before run attr: world; a: A; b: B
# world, AB
# after  run attr: world; a: A; b: B
相關文章
相關標籤/搜索