def logging(level): def wrapper(func): def inner_wrapper(*args, **kwargs): print "[{level}]: enter function {func}()".format( level=level, func=func.__name__) return func(*args, **kwargs) return inner_wrapper return wrapper @logging(level="INFO") def say(something): print "say {}!".format(something) # 如果沒有使用@語法,等同于 # say = logging(level="INFO")(say) @logging(level="DEBUG") def do(something): print "do {}...".format(something) if __name__ == "__main__": say("hello") do("my work")
裝飾器調(diào)用順序
#!/usr/bin/env python # encoding: utf-8 def decorator_a(func): print func print "Get in decorator_a" def inner_a(*args, **kwargs): print "Get in inner_a" return func(*args, **kwargs) return inner_a def decorator_b(func): print func print "Get in decorator_b" def inner_b(*args, **kwargs): print "Get in inner_b" return func(*args, **kwargs) return inner_b @decorator_b @decorator_a def f(x): print "Get in f" return x * 2 f(1)
執(zhí)行結(jié)果
Get in decorator_a Get in decorator_b Get in inner_b Get in inner_a Get in f
f(1)等價于decorator_b(decorator_a(f))(1)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42924.html
摘要:如果不使用裝飾器的話,普通的做法可能是在中寫一堆校驗代碼來判斷用戶是否登錄,然后決定后面的執(zhí)行邏輯,這樣比較麻煩。 前言 裝飾器是程序開發(fā)中經(jīng)常會用到的一個功能,也是python語言開發(fā)的基礎(chǔ)知識,如果能夠在程序中合理的使用裝飾器,不僅可以提高開發(fā)效率,而且可以讓寫的代碼看上去顯的高大上^_^ 使用場景 可以用到裝飾器的地方有很多,簡單的舉例如以下場景 引入日志 函數(shù)執(zhí)行時間統(tǒng)計 執(zhí)...
摘要:探究多個裝飾器執(zhí)行順序裝飾器是用于封裝函數(shù)或代碼的工具,網(wǎng)上可以搜到很多文章可以學(xué)習(xí),我在這里要討論的是多個裝飾器執(zhí)行順序的一個迷思。這時候你該知道為什么輸出結(jié)果會是那樣,以及對裝飾器執(zhí)行順序?qū)嶋H發(fā)生了什么有一定了解了吧。 探究多個裝飾器執(zhí)行順序 裝飾器是Python用于封裝函數(shù)或代碼的工具,網(wǎng)上可以搜到很多文章可以學(xué)習(xí),我在這里要討論的是多個裝飾器執(zhí)行順序的一個迷思。 疑問 大部...
摘要:最近看到一個關(guān)于的題文章其中的一個是裝飾器的順序問題就想寫篇博客回顧下裝飾器首先強烈推薦很久之前看的一篇博文翻譯理解中的裝飾器關(guān)于什么是裝飾器看這篇文章就好了這里主要想寫關(guān)于多個裝飾器的執(zhí)行流程裝飾順序示例代碼初始化初始化輸出結(jié)果初始化初始 最近看到一個關(guān)于Flask的CTF(RealWorld CTF 2018 web題bookhub)文章其中的一個trick是裝飾器的順序問題,就想...
今天講一下python中裝飾器的執(zhí)行順序,以兩個裝飾器為例。 裝飾器代碼如下: def wrapper_out1(func): print(--out11--) def inner1(*args, **kwargs): print(--in11--) ret = func(*args, **kwargs) print(--in12-...
摘要:在這種代碼運行期間動態(tài)增加功能的方式,稱之為裝飾器。四接收特定類型參數(shù)的裝飾器裝飾器可以接收參數(shù),當(dāng)調(diào)用裝飾器返回的函數(shù)時,也就調(diào)用了包裹函數(shù),把參數(shù)傳入包裹函數(shù),它將參數(shù)傳遞給被裝飾的函數(shù)。執(zhí)行結(jié)果執(zhí)行結(jié)果 【題外話】心塞塞 心情down down down 有段時間沒用裝飾器了,然后然后問著就跪了~~~回來翻了翻資料和代碼...... 一、什么是裝飾器 裝飾器,decor...
摘要:裝飾器的使用符合了面向?qū)ο缶幊痰拈_放封閉原則。三簡單的裝飾器基于上面的函數(shù)執(zhí)行時間的需求,我們就手寫一個簡單的裝飾器進(jìn)行實現(xiàn)。函數(shù)體就是要實現(xiàn)裝飾器的內(nèi)容。類裝飾器的實現(xiàn)是調(diào)用了類里面的函數(shù)。類裝飾器的寫法比我們裝飾器函數(shù)的寫法更加簡單。 目錄 前言 一、什么是裝飾器 二、為什么要用裝飾器 ...
閱讀 1020·2021-11-22 13:52
閱讀 1450·2021-11-19 09:40
閱讀 3185·2021-11-16 11:44
閱讀 1279·2021-11-15 11:39
閱讀 3914·2021-10-08 10:04
閱讀 5374·2021-09-22 14:57
閱讀 3108·2021-09-10 10:50
閱讀 3191·2021-08-17 10:13