日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python装饰器执行顺序

發(fā)布時間:2023/12/6 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python装饰器执行顺序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

1、單個裝飾器執(zhí)行

上來先看代碼:

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í)行順序為主線程——》裝飾器,裝飾器中調(diào)用了被裝飾函數(shù)的話就在裝飾器中依次執(zhí)行

2、多個裝飾器執(zhí)行

被裝飾函數(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"

運行結(jié)果如下:

可以看到,先執(zhí)行了deco,再執(zhí)行deco1,然后deco1執(zhí)行完返回結(jié)果作為參數(shù)傳入deco繼續(xù)執(zhí)行。

這就可以回到裝飾器的原理來看:

裝飾器是在編譯時就執(zhí)行,而不是調(diào)用時;裝飾器只對函數(shù)進(jìn)行裝飾,不對裝飾器進(jìn)行裝飾,誰貼函數(shù)進(jìn)誰先執(zhí)行。

多個裝飾器執(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装饰器执行顺序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。