python多個裝飾器的執行順序

2022-08-19 03:57:12 字數 1493 閱讀 9462

def decorator_a(func):

print 'get in decorator_a'

def inner_a(*args, **kwargs):

print 'get in inner_a'

return func(*args, **kwargs)

return inner_a

def decorator_b(func):

print 'get in decorator_b'

def inner_b(*args, **kwargs):

print 'get in inner_b'

return func(*args, **kwargs)

return inner_b

@decorator_b

@decorator_a

def f(x):

print 'get in f'

return x * 2

f(1)

執行如上所示**,最後的執行結果為:

get in decorator_a

get in decorator_b

get in inner_b

get in inner_a

get in f

我們來分析下,為什麼會是這樣的順序(驗證的過程中可以通過打斷點的方式來觀察函式的程式的執行流程)。

首先:1、裝飾器函式在被裝飾函式定義好後立即執行。

我們把**最後一行注掉:

# f(1)

重新執行,會發現最後執行結果為:

get in decorator_a

get in decorator_b

說明裝飾器函式在被裝飾函式定義好後就立即執行。而且執行順序是由下到上開始裝飾。呼叫decorator_a時,f被裝飾成inner_a,呼叫decorator_b時,f被裝飾成inner_b。

通過在最後執行:print(f), 執行結果為可驗證。

所以如上所示**中,最後執行f(1)時,f已經變成了inner_b,而inner_b中return的func,實則為inner_a, inner_a中return的func才是最終的f。

所以最後的呼叫順序為

inner_b --->inner_a--->f

執行結果為:

get in inner_b

get in inner_a

get in f

在實際應用的場景中,當我們採用上面的方式寫了兩個裝飾方法比如先驗證有沒有登入 @login_required , 再驗證許可權夠不夠時 @permision_allowed 時,我們採用下面的順序來裝飾函式:

@login_required

@permision_allowed

def f()

# do something

return

總結一下:

多個裝飾器裝飾函式時,有個規律是從小到上包裹(裝飾)函式,從上到下執行。

原文:

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