python中多個裝飾器的執(zhí)行順序詳解
裝飾器是程序開發(fā)中經(jīng)常會用到的一個功能,也是python語言開發(fā)的基礎知識,如果能夠在程序中合理的使用裝飾器,不僅可以提高開發(fā)效率,而且可以讓寫的代碼看上去顯的高大上^_^
使用場景
可以用到裝飾器的地方有很多,簡單的舉例如以下場景
- 引入日志
- 函數(shù)執(zhí)行時間統(tǒng)計
- 執(zhí)行函數(shù)前預備處理
- 執(zhí)行函數(shù)后清理功能
- 權限校驗等場景
- 緩存
今天講一下python中裝飾器的執(zhí)行順序,以兩個裝飾器為例。
裝飾器代碼如下:
def wrapper_out1(func): print('--out11--') def inner1(*args, **kwargs): print("--in11--") ret = func(*args, **kwargs) print("--in12--") return ret print("--out12--") return inner1 def wrapper_out2(func): print('--out21--') def inner2(*args, **kwargs): print("--in21--") ret = func(*args, **kwargs) print("--in22--") return ret print("--out22") return inner2 @wrapper_out2 @wrapper_out1 def test(): print("--test--") return 1 * 2 if __name__ == '__main__': test()
執(zhí)行結果如下:
"""
--out11--
--out12--
--out21--
--out22--
--in21--
--in11--
--test--
--in12--
--in22--
"""
執(zhí)行順序以圖片形式展示如下:
先進入離test函數(shù)最近的裝飾器,由于裝飾器中返回的是函數(shù)的函數(shù)名引用,并非真正調(diào)用函數(shù),所以先打印:
--out11--
--out12--
--out21--
--out22--
到inner2后,func會真正執(zhí)行函數(shù),會調(diào)用inner1(),所以再打?。?/p>
--in21--
--in11--
到inner1中,func會調(diào)用test函數(shù),所以會打?。?/p>
--test--
再從各個函數(shù)出來后,會依次打?。?/p>
--in12--
--in22--
合起來就是上面的執(zhí)行結果。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
pycharm?python代碼調(diào)試跳出for循環(huán)問題
這篇文章主要介紹了pycharm?python代碼調(diào)試跳出for循環(huán)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08python自動化腳本安裝指定版本python環(huán)境詳解
這篇文章主要為大家詳細介紹了python自動化腳本安裝指定版本python環(huán)境的相關方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09Python使用matplotlib給柱狀圖添加數(shù)據(jù)標簽bar_label()
這篇文章主要介紹了Python使用matplotlib給柱狀圖添加數(shù)據(jù)標簽bar_label(),記錄如何用使用matplotlib給柱狀圖添加數(shù)據(jù)標簽,是以matplotlib.pyplot.bar_label()為例,需要的朋友可以參考一下2022-03-03Django認證系統(tǒng)user對象實現(xiàn)過程解析
這篇文章主要介紹了Django認證系統(tǒng)user對象實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03DenseNet121模型實現(xiàn)26個英文字母識別任務
這篇文章主要為大家介紹了DenseNet121模型實現(xiàn)26個英文字母識別任務的實例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04