今天講一下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í)行結(jié)果如下:
""" --out11-- --out12-- --out21-- --out22-- --in21-- --in11-- --test-- --in12-- --in22-- """
執(zhí)行順序以圖片形式展示如下:
先進(jìn)入離test函數(shù)最近的裝飾器,由于裝飾器中返回的是函數(shù)的函數(shù)名引用,并非真正調(diào)用函數(shù),所以先打印:
--out11-- --out12-- --out21-- --out22--
到inner2后,func會真正執(zhí)行函數(shù),會調(diào)用inner1(),所以再打印:
--in21-- --in11--
到inner1中,func會調(diào)用test函數(shù),所以會打印:
--test--
再從各個函數(shù)出來后,會依次打印:
--in12-- --in22--
合起來就是上面的執(zhí)行結(jié)果。
以上就是裝飾器的執(zhí)行順序,如有錯誤,歡迎交流指正!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/42583.html
摘要:如果不使用裝飾器的話,普通的做法可能是在中寫一堆校驗代碼來判斷用戶是否登錄,然后決定后面的執(zhí)行邏輯,這樣比較麻煩。 前言 裝飾器是程序開發(fā)中經(jīng)常會用到的一個功能,也是python語言開發(fā)的基礎(chǔ)知識,如果能夠在程序中合理的使用裝飾器,不僅可以提高開發(fā)效率,而且可以讓寫的代碼看上去顯的高大上^_^ 使用場景 可以用到裝飾器的地方有很多,簡單的舉例如以下場景 引入日志 函數(shù)執(zhí)行時間統(tǒng)計 執(zhí)...
摘要:裝飾器的使用符合了面向?qū)ο缶幊痰拈_放封閉原則。三簡單的裝飾器基于上面的函數(shù)執(zhí)行時間的需求,我們就手寫一個簡單的裝飾器進(jìn)行實現(xiàn)。函數(shù)體就是要實現(xiàn)裝飾器的內(nèi)容。類裝飾器的實現(xiàn)是調(diào)用了類里面的函數(shù)。類裝飾器的寫法比我們裝飾器函數(shù)的寫法更加簡單。 目錄 前言 一、什么是裝飾器 二、為什么要用裝飾器 ...
摘要:在這種代碼運行期間動態(tài)增加功能的方式,稱之為裝飾器。四接收特定類型參數(shù)的裝飾器裝飾器可以接收參數(shù),當(dāng)調(diào)用裝飾器返回的函數(shù)時,也就調(diào)用了包裹函數(shù),把參數(shù)傳入包裹函數(shù),它將參數(shù)傳遞給被裝飾的函數(shù)。執(zhí)行結(jié)果執(zhí)行結(jié)果 【題外話】心塞塞 心情down down down 有段時間沒用裝飾器了,然后然后問著就跪了~~~回來翻了翻資料和代碼...... 一、什么是裝飾器 裝飾器,decor...
摘要:最近看到一個關(guān)于的題文章其中的一個是裝飾器的順序問題就想寫篇博客回顧下裝飾器首先強(qiáng)烈推薦很久之前看的一篇博文翻譯理解中的裝飾器關(guān)于什么是裝飾器看這篇文章就好了這里主要想寫關(guān)于多個裝飾器的執(zhí)行流程裝飾順序示例代碼初始化初始化輸出結(jié)果初始化初始 最近看到一個關(guān)于Flask的CTF(RealWorld CTF 2018 web題bookhub)文章其中的一個trick是裝飾器的順序問題,就想...
摘要:重寫內(nèi)建名字空間中的函數(shù)閉包閉包是詞法閉包的簡稱。另一種說法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實體。 Python 中的 Decorator(裝飾器) 是對一個函數(shù)或者方法的封裝,從而使其可以完成一些與自身功能無關(guān)的工作。 預(yù)備知識 一切皆對象 在 Python 中,所有的一切都被視為對象,任何的變量、函數(shù)、類等都是 object 的子類。因此除了變量之外,函數(shù)和類等也可以...
閱讀 1951·2021-10-12 10:12
閱讀 3077·2019-08-30 15:44
閱讀 846·2019-08-30 15:43
閱讀 2999·2019-08-30 14:02
閱讀 2083·2019-08-30 12:54
閱讀 3505·2019-08-26 17:05
閱讀 1986·2019-08-26 13:34
閱讀 1058·2019-08-26 11:54