摘要:如果不使用裝飾器的話,普通的做法可能是在中寫一堆校驗代碼來判斷用戶是否登錄,然后決定后面的執行邏輯,這樣比較麻煩。
前言
裝飾器是程序開發中經常會用到的一個功能,也是python語言開發的基礎知識,如果能夠在程序中合理的使用裝飾器,不僅可以提高開發效率,而且可以讓寫的代碼看上去顯的高大上^_^
使用場景可以用到裝飾器的地方有很多,簡單的舉例如以下場景
引入日志
函數執行時間統計
執行函數前預備處理
執行函數后清理功能
權限校驗等場景
緩存
裝飾器案例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): """ 獲取數據 處理數據 傳遞到頁面上去
以上是一個簡單電商應用中使用裝飾器的案例,其中 ucOrder函數是是用戶需要登錄后才能被執行到的。如果不使用裝飾器的話,普通的做法可能是在 ucOrder中寫一堆校驗代碼來判斷用戶是否登錄,然后決定后面的執行邏輯,這樣比較麻煩。
那么使用裝飾器之后就比較簡單了,只需要按照裝飾器的使用格式,在ucOrder函數上面加上@user_login,那么python解釋器在運行的時候,就會從上到下解釋代碼,先執行user_login函數,并且將ucOrder作為user_login函數的參數傳入進去,即等價于user_login(ucOrder),這樣就起到了一個校驗用戶是否登錄,從而決定是否執行ucOrder函數的功能
多個裝飾器使用的調用順序def one(func): print("----1----") def two(): print("----2----") func() return two def a(func): print("----a----") def b(): print("----b----") func() return b @one @a def demo(): print("----3----") demo()
執行結果:
/usr/bin/python2.7 /home/python/Desktop/tornadoProject/one.py ----a---- ----1---- ----2---- ----b---- ----3----
可以從執行結果中看到,如果是使用多個裝飾器,它的執行順序還是有點怪異的的,為什么會這樣呢?
關于這個問題,有更好的文章可以解釋,具體見以下鏈接
Python 裝飾器執行順序迷思
其他參考文章:
理解 Python 裝飾器看這一篇就夠了
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38425.html
今天講一下python中裝飾器的執行順序,以兩個裝飾器為例。 裝飾器代碼如下: def wrapper_out1(func): print(--out11--) def inner1(*args, **kwargs): print(--in11--) ret = func(*args, **kwargs) print(--in12-...
摘要:裝飾器的使用符合了面向對象編程的開放封閉原則。三簡單的裝飾器基于上面的函數執行時間的需求,我們就手寫一個簡單的裝飾器進行實現。函數體就是要實現裝飾器的內容。類裝飾器的實現是調用了類里面的函數。類裝飾器的寫法比我們裝飾器函數的寫法更加簡單。 目錄 前言 一、什么是裝飾器 二、為什么要用裝飾器 ...
摘要:在這種代碼運行期間動態增加功能的方式,稱之為裝飾器。四接收特定類型參數的裝飾器裝飾器可以接收參數,當調用裝飾器返回的函數時,也就調用了包裹函數,把參數傳入包裹函數,它將參數傳遞給被裝飾的函數。執行結果執行結果 【題外話】心塞塞 心情down down down 有段時間沒用裝飾器了,然后然后問著就跪了~~~回來翻了翻資料和代碼...... 一、什么是裝飾器 裝飾器,decor...
摘要:重寫內建名字空間中的函數閉包閉包是詞法閉包的簡稱。另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。 Python 中的 Decorator(裝飾器) 是對一個函數或者方法的封裝,從而使其可以完成一些與自身功能無關的工作。 預備知識 一切皆對象 在 Python 中,所有的一切都被視為對象,任何的變量、函數、類等都是 object 的子類。因此除了變量之外,函數和類等也可以...
摘要:探究多個裝飾器執行順序裝飾器是用于封裝函數或代碼的工具,網上可以搜到很多文章可以學習,我在這里要討論的是多個裝飾器執行順序的一個迷思。這時候你該知道為什么輸出結果會是那樣,以及對裝飾器執行順序實際發生了什么有一定了解了吧。 探究多個裝飾器執行順序 裝飾器是Python用于封裝函數或代碼的工具,網上可以搜到很多文章可以學習,我在這里要討論的是多個裝飾器執行順序的一個迷思。 疑問 大部...
閱讀 2831·2023-04-25 20:06
閱讀 1450·2021-08-26 14:15
閱讀 2239·2021-08-12 13:27
閱讀 1775·2019-08-30 15:55
閱讀 3476·2019-08-30 13:20
閱讀 2832·2019-08-29 15:12
閱讀 3336·2019-08-29 15:06
閱讀 2862·2019-08-29 14:13