python 多個裝飾器的呼叫順序

高洛峰
發布: 2017-02-17 11:01:19
原創
1057 人瀏覽過

前言

裝飾器是程式開發中常會用到的功能,也是python語言開發的基礎知識,如果能夠在程式中合理的使用裝飾器,不僅可以提高開發效率,而且可以讓寫的程式碼看上去顯的高大上^_^

使用場景

可以用到裝飾器的地方有很多,簡單的舉例如以下場景

  • 引入日誌

  • 函數執行時間統計函數。前預備處理

  • 執行函數後清理功能

  • 權限校驗等場景

  • 快取

  • 案例,其中ucOrder函數是是使用者需要登入後才能執行到的。如果不使用裝飾器的話,普通的做法可能是在 ucOrder中寫一堆校驗程式碼來判斷使用者是否登錄,然後決定後面的執行邏輯,這樣比較麻煩。

  • 那麼使用裝飾器之後就比較簡單了,只需要按照裝飾器的使用格式,在ucOrder函數上面加上@user_login,那麼python解釋器在運行的時候,就會從上到下解釋程式碼,先執行user_login函數,並且將ucOrder作為user_login函數的參數傳入進去,即等價於user_login(ucOrder),這樣就起到了一個校驗用戶是否登錄,從而決定是否執行ucOrder函數的功能

多個裝飾器使用的呼叫順序

def user_login(fun):
    def islogin(request,*args,**kwargs):
        context = {}
        if request.session.has_key('uname'):
            context['uname'] = request.session.get('uname')
        else:
            context['uname'] = 'None'
        return fun(request,context,*args,**kwargs)
    return islogin
登入後複製

執行結果:

@user_login
def ucOrder(request,context,pIndex):
    '''
    获取数据
    处理数据
    传递到页面上去
登入後複製
可以從執行結果中看到,如果是使用多個裝飾器,它的執行順序還是有點怪異的,為什麼會這樣呢?

關於這個問題,有更好的文章可以解釋,Python 裝飾器執行順序迷思

更多python 多個裝飾器的調用順序相關文章請關注PHP中文網!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!