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