Python裝飾器淺解

Python裝飾器分爲兩個過程:

一是裝飾器裝載過程;
二是調用裝載後的裝飾器過程;

示例:

# @auth: applex
# @date: 2018-10-10
# coding=utf-8


def deco1(func):
    print ("deco1 loading!")
    def one():
        print ('one calling!')
        func()
        print ('one calling end!')
    return one


def deco2(func):
    print ("deco2 loading!")
    def two():
        print('two calling!')
        func()
        print ('two calling end!')
    return two


@deco1
@deco2
def test():
    print ('test calling!')


test()

結果

deco2 loading!
deco1 loading!
one calling!
two calling!
test calling!
two calling end!
one calling end!

代碼執行過程如下:
解釋器遇到裝飾函數首先執行裝載,相當於執行了test=deco1(deco2(test)):

  • 首先執行deco2(test),輸出deco2 loading!,將deco2的func參數指向test函數,並返回函數two;
  • 接着執行deco1(two),輸出deco1 loading!,將deco1的func參數指向two函數,並返回函數one;
  • 裝載完畢後,得到結果 test = one
  • 最後調用test,實際調用函數one,輸出one calling!
    在函數one中調用函數func,實際調用的是函數two,輸出two calling!
    在函數two中調用函數func,實際調用的是函數test的代碼,輸出test calling!
    調用結束後,按調用順序依次返回two calling end!one calling end!

如果註釋掉 test()調用,則結果:

deco2 loading!
deco1 loading!

參考博文:
python裝飾器詳解 1


  1. https://blog.csdn.net/xiangxianghehe/article/details/77170585 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章