參考教程: https://blog.csdn.net/jyhhhhhhh/article/details/54627850
#當有多個裝飾器裝飾一個函數時,他們的執行順序
#觀察下方的代碼就會發現
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):
#decorator_b(decorator_a(f))
#而以上代碼【decorator_b(decorator_a(f))】返回的是inner_b,所以執行的時候是先執行inner_b
#然后在執行【decorator_a(f)】返回的inner_a .最終在調用f(1)的時候,函數inner_b輸出'Get in inner_b'
#然后執行inner_a輸出Get in decorator_a,最后執行func(),即f
#調用時,函數的順序
'''
@decorator_b
@decorator_a
def f(x)
相當於-------decorator_b(decorator_a(f)),其中每一層返回的都是一個函數對象,沒有調用
之后返回時的函數對象--------inner_b(inner_a)
然后最后一行當我們對 f 傳入參數1進行調用時, inner_b 被調用了,它會先打印 Get in inner_b ,
然后在 inner_b 內部調用了 inner_a 所以會再打印 Get in inner_a, 然后再 inner_a 內部調用的原來的 f,
並且將結果作為最終的返回
'''
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
實際中的使用
在實際應用的場景中,當我們采用上面的方式寫了兩個裝飾方法,比如先驗證有沒有登錄@login_required, 再驗證權限夠不夠時@permision_allowed時,我們采用下面的順序來裝飾函數: @login_required @permision_allowed def f() # Do something
