裝飾器函式的執行順序是分為(
被裝飾函式
)定義階段和(
被裝飾函式
)執行階段的,裝飾器函式在被裝飾函式定義好後立即執行
**如下:
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...