多個裝飾器的執行順序

2021-08-20 11:44:38 字數 1970 閱讀 3901

裝飾器函式的執行順序是分為(

被裝飾函式

)定義階段和(

被裝飾函式

)執行階段的,裝飾器函式在被裝飾函式定義好後立即執行

**如下:

def war1(func):

print("war1")

def inner(*args, **kwargs):

print("*****=war1 start*****")

func(*args, **kwargs) #inner

print("*****=war1 end*****")

return inner

def war2(func):

print("war2")

def inner(*args,**kwargs):

print("*****=war2 start*****")

func(*args,**kwargs)

print("*****=war2 end*****")

return inner

@war1

@war2

def f():

print("****self****")

f()

執行結果:

那麼為什麼會是這樣的順序

看到這個執行結果,我們可能會疑惑,為什麼先列印了war2 和war1呢?

首先要知道,裝飾器函式在被裝飾函式定義好後就立即執行了

我們去掉函式執行,只留下函式的定義,**如下:

def war1(func):

print("war1")

def inner(*args, **kwargs):

print("*****=war1 start*****")

func(*args, **kwargs) #inner

print("*****=war1 end*****")

return inner

def war2(func):

print("war2")

def inner(*args,**kwargs):

print("*****=war2 start*****")

func(*args,**kwargs)

print("*****=war2 end*****")

return inner

@war1

@war2

def f():

print("****self****")

執行結果:

也就是說在 f 方法沒有執行的時候,裝飾器函式就執行了

此處我們需要先弄清楚,函式和函式呼叫的區別,f 是乙個函式,它的值是函式本身, f( )是函式的呼叫,它的值是函式的執行結果

在被裝飾函式定義階段,也就是函式呼叫之前:

@war1

@war2

def f():

print("****self****")

這段**相當於:

war1(war2(f))
war1和war2的返回值都是乙個函式,所以war1(war2(f))也是乙個函式,war2包含了f函式,war1包含了war2

f()  相當於  

war1(war2(f))()  

所以f ( )在執行時,war2-->war1--> war1-->war2-->f -->war2-->war1 按照這樣的順序執行

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