def f_out1(f1):
print('我是裝飾器1')
def f_in1():
print('我是裝飾器1的內嵌函式')
f1()
return f_in1
#裝飾器2
def f_out2(f2):
print('我是裝飾器2')
def f_in2():
print('我是裝飾器2的內嵌函式')
f2()
return f_in2
@f_out1
@f_out2
def f():
print('我是f')
f()
我是裝飾器2
我是裝飾器1
我是裝飾器1的內嵌函式
我是裝飾器2的內嵌函式
我是f
1)可以直接理解裝飾順序是自下而上的
2)深入解析
@f_out1
@f_out2
def f():
print('我是f')
此段**等效於 f = f_out1(f_out2(f))
這裡要注意的是裝飾器1的引數,內嵌函式,裝飾器2的引數和內嵌函式各指向什麼。
分析f = f_out1(f_out2(f)):
第一步:首先f_out2( f )先執行, print(『我是裝飾器2』) 就會執行,輸出我是裝飾器2。然後裝飾器2的引數f2指向的就是f,然後返回裝飾器2 的內嵌函式f_in2。
第二步:隨後f_in2就會作為引數傳入裝飾器1,即會執行f_out1( f_in2 ),然後 print(『我是裝飾器1』) 就會執行,輸出我是裝飾器1。這時候裝飾1的引數 f1 就指向了裝飾器2的內嵌函式,而裝飾器1的內嵌函式 f_in 就會傳給等號左邊的變數f
對 f() 的執行進行分析
1)有上面的分析可以知道此時f指向的是裝飾1的內嵌函式,f() 執行即裝飾器1的內嵌函式執行,然後下面**將執行
def f_in1():
print('我是裝飾器1的內嵌函式')
f1()
首先列印我是裝飾器1的內嵌函式,輸出我是裝飾器1的內嵌函式,然後執行 f1()
2)注意f1 指向的是裝飾器2的內嵌函式 f_in2 ,所以f1() 執行就是裝飾器2的內嵌函式執行,即執行下面的**
def f_in2():
print('我是裝飾器2的內嵌函式')
f2()
首先列印我是裝飾器2的內嵌函式,輸出我是裝飾器2的內嵌函式,然後執行 f2()
3)注意這裡的f2 指向的是函式f ,所以函式 f 就會執行
def f():
print('我是f')
列印我是f
最終列印結果就是
我是裝飾器2
我是裝飾器1
我是裝飾器1的內嵌函式
我是裝飾器2的內嵌函式
我是f
Python 多個裝飾器的執行順序
一.多個裝飾器的的執行順序 接下來我們以例子來檢視執行順序 def decorator a func print get in decorator a def inner a args,kwargs print get in inner a res func args,kwargs return r...
python 多個裝飾器的執行順序
我們通過下面這個例子來看多個為裝飾器的執行順序。def decorator a func print get in decorator a def inner a args,kwargs print get in inner a res func args,kwargs return res ret...
python多個裝飾器的執行順序
defdecorator a func print get in decorator a definner a args,kwargs print get in inner a returnfunc args,kwargs returninner a defdecorator b func prin...