python多個裝飾器的執行順序


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), 執行結果為<function inner_b at 0x00000000038F15F8>可驗證。

所以如上所示代碼中,最后執行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

  

總結一下:

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


原文:https://blog.csdn.net/qq_35462323/article/details/90633796


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM