一句話說清楚多個裝飾器的執行順序

NO IMAGE

要理清楚多個裝飾器的執行順序,對於很多人來說是噩夢一般的存在,但是,這個其實一句話就能說明白的,先看下面程式碼:

def out_1(func):
print('i am out_1')
def inner_1():
print('i am inner_1')
return func()
return inner_1
def out_2(func):
print('i am out_2')
def inner_2():
print('i am inner_2')
return func()
return inner_2
@out_1
@out_2
def func_print():
print('i am func_print')
func_print()

定義了兩個裝飾器函式,out1,out2,執行結果如下:

i am out_2
i am out_1
i am inner_1
i am inner_2
i am func_print

好吧,一句話這麼理解:裝飾器,只對函式進行裝飾,裝飾器不對裝飾器進行裝飾,所以

1~~~~out2先裝飾func_print函式,相當於執行func_print = out_2(func_print),所以先列印了 i am out_2,

2~~~~@out_2裝飾完之後,@out1再對func_print進行裝飾,並且此時的func_print已經指向了inner_2函式,所以@out_1對他進行裝飾相當於func_print= out1(inner_2)這個時候就會執行”i am out_1″的列印,

3~~~~此時的func_print就指向了inner_1,就是兩個裝飾都裝飾完畢了,最後一行程式碼呼叫了func_print(),所以就相當於呼叫了inner_1,這個時候列印”i am inner_1″

4~~~~列印完成之後執行到inner_1裡的return func() 此時的func是inner_2,再執行inner_2列印‘I am inner_2’,

5~~~~而inner_2裡還有return fun(),這時的func才是最初的func_print,最後列印‘i am func_print’

以上描述看似複雜,但是你如果能理解這個黑體加粗的話,裝飾器裝飾順序就是so easy!!!!!有木有