python多個裝飾器的執行順序解析

2021-09-24 00:15:06 字數 1662 閱讀 4706

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...