python装饰器执行顺序
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
1、單個(gè)裝飾器執(zhí)行
上來(lái)先看代碼:
import timedef deco(func):@functools.wraps(func)def _wrapper():startTime = time.time()print "start"func()print "end"endTime = time.time()msecs = (endTime - startTime)*1000print("time is %d ms" %msecs)return _wrapper@deco def func():print("hello")time.sleep(1)print("world")if __name__ == '__main__':print "main start"f = func print "mid"f()print "main end"再看執(zhí)行結(jié)果:
由此我們可以看出,裝飾器執(zhí)行順序?yàn)橹骶€程——》裝飾器,裝飾器中調(diào)用了被裝飾函數(shù)的話就在裝飾器中依次執(zhí)行。
2、多個(gè)裝飾器執(zhí)行
被裝飾函數(shù)被多個(gè)裝飾器裝飾時(shí),代碼如下:
import timedef deco1(func):@functools.wraps(func)def _wrapper():startTime = time.time()print "start1"func()print "end1"endTime = time.time()msecs = (endTime - startTime)*1000print("time1 is %d ms" %msecs)return _wrapperdef deco(func):@functools.wraps(func)def _wrapper():startTime = time.time()print "start"func()print "end"endTime = time.time()msecs = (endTime - startTime)*1000print("time is %d ms" %msecs)return _wrapper@deco @deco1 def func():print("hello")time.sleep(1)print("world")if __name__ == '__main__':print "main start"f = funcprint "mid"f()print "main end"運(yùn)行結(jié)果如下:
可以看到,先執(zhí)行了deco,再執(zhí)行deco1,然后deco1執(zhí)行完返回結(jié)果作為參數(shù)傳入deco繼續(xù)執(zhí)行。
這就可以回到裝飾器的原理來(lái)看:
裝飾器是在編譯時(shí)就執(zhí)行,而不是調(diào)用時(shí);裝飾器只對(duì)函數(shù)進(jìn)行裝飾,不對(duì)裝飾器進(jìn)行裝飾,誰(shuí)貼函數(shù)進(jìn)誰(shuí)先執(zhí)行。
多個(gè)裝飾器執(zhí)行的例子,就相當(dāng)于func = deco1(func), func = deco(func), func()?這也等同于func = deco(deco1(func)), func()。
例如:
import timedef deco1(func):@functools.wraps(func)def _wrapper():startTime = time.time()print "start1"func()print "end1"endTime = time.time()msecs = (endTime - startTime)*1000print("time1 is %d ms" %msecs)return _wrapperdef deco(func):@functools.wraps(func)def _wrapper():startTime = time.time()print "start"func()print "end"endTime = time.time()msecs = (endTime - startTime)*1000print("time is %d ms" %msecs)return _wrapper# @deco # @deco1 def func():print("hello")time.sleep(1)print("world")if __name__ == '__main__':print "main start"func = deco(deco1(func)) #編譯func() #執(zhí)行print "mid"print "main end"執(zhí)行結(jié)果和使用deco,deco1裝飾器相同。
轉(zhuǎn)載于:https://my.oschina.net/u/3636678/blog/2208910
總結(jié)
以上是生活随笔為你收集整理的python装饰器执行顺序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 【死磕 Spring】----- IOC
- 下一篇: Object关于属性property的静
