摘要:剛接觸,看到裝飾器相關(guān)的內(nèi)容花了不少時(shí)間理解,參考了一些博客,這里做一些總結(jié)。用提供的語法糖來降低字符輸入量。定義函數(shù)時(shí)加上這一行與另外寫完全等價(jià)如有錯(cuò)漏,請(qǐng)指正參考資料
剛接觸python,看到裝飾器相關(guān)的內(nèi)容花了不少時(shí)間理解,參考了一些博客,這里做一些總結(jié)。
先定義一個(gè)簡(jiǎn)單的函數(shù)foo
def foo(): print "call foo()"
現(xiàn)在我們想要計(jì)算次函數(shù)執(zhí)行的時(shí)間,于是修改代碼如下
import time def foo(): start = time.clock() print "call foo()" end = time.clock() print "using time:",end - start
思考一下,這樣做能夠?qū)崿F(xiàn),可是如果我還想知道另一個(gè)foo_1的運(yùn)行時(shí)間,那我只能把上面新增加的代碼復(fù)制到foo_1這個(gè)函數(shù)里面,十分麻煩,能不能夠不要改變?cè)镜暮瘮?shù),即計(jì)算時(shí)間的代碼不加在本來的函數(shù)里面。
這應(yīng)該不難,很容易想到可以這樣寫
import time def foo(): print "call foo()" def cal_time(func): start = time.clock() func() end =time.clock() print "using time:", end - start cal_time(foo)
這樣,如果還需要計(jì)算函數(shù)foo_1的時(shí)間,只需要cal_time(foo_1)就好了。
但是,這樣其實(shí)改變了函數(shù)原本的調(diào)用方式,開始我們是這樣調(diào)用foo()
現(xiàn)在是cal_time(foo)
那么如果現(xiàn)在需要修改foo為foo_plus,我就必須更改n處調(diào)用了foo的代碼!
還有更好的實(shí)現(xiàn)方式嗎?能否使調(diào)用foo()產(chǎn)生時(shí)調(diào)用cal_time(foo)的效果?
可以想到,把cal_time(foo)的返回值賦給foo,看看下面的實(shí)現(xiàn)
import time def foo(): print "call foo()" # 定義一個(gè)計(jì)時(shí)器,傳入一個(gè)函數(shù),并返回另一個(gè)附加了計(jì)時(shí)功能的方法 def cal_time(func): # 定義一個(gè)內(nèi)嵌的包裝函數(shù),給傳入的函數(shù)加上計(jì)時(shí)功能的包裝 def wrapper(): start = time.clock() func() end =time.clock() print "using time:", end - start # 將包裝后的函數(shù)返回 return wrapper foo = cal_time(foo) foo()
這樣便無需改變?cè)瘮?shù)及其調(diào)用,想計(jì)算函數(shù)foo的用時(shí),在函數(shù)調(diào)用foo()前,加上foo = cal_time(foo)即可。
用Python提供的語法糖來降低字符輸入量。
import time def cal_time(func): def wrapper(): start = time.clock() func() end =time.clock() print "using time:", end - start return wrapper @cal_time #定義函數(shù)時(shí)加上這一行與另外寫foo = cal_time(func):完全等價(jià) def foo(): print "call foo()" foo()
如有錯(cuò)漏,請(qǐng)指正
參考資料:
1.http://www.cnblogs.com/rollen...
2.https://www.liaoxuefeng.com/w...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41051.html
摘要:最近看到一個(gè)關(guān)于的題文章其中的一個(gè)是裝飾器的順序問題就想寫篇博客回顧下裝飾器首先強(qiáng)烈推薦很久之前看的一篇博文翻譯理解中的裝飾器關(guān)于什么是裝飾器看這篇文章就好了這里主要想寫關(guān)于多個(gè)裝飾器的執(zhí)行流程裝飾順序示例代碼初始化初始化輸出結(jié)果初始化初始 最近看到一個(gè)關(guān)于Flask的CTF(RealWorld CTF 2018 web題bookhub)文章其中的一個(gè)trick是裝飾器的順序問題,就想...
摘要:今天我們一起探討一下裝飾器的另類用法。語法回顧開始之前我們?cè)賹⒀b飾器的語法回顧一下。例子本身只是演示了裝飾器的一種用法,但不是推薦你就這樣使用裝飾器。類裝飾器在以前,還不支持類裝飾器。 之前有比較系統(tǒng)介紹過Python的裝飾器(請(qǐng)查閱《詳解Python裝飾器》),本文算是一個(gè)補(bǔ)充。今天我們一起探討一下裝飾器的另類用法。 語法回顧 開始之前我們?cè)賹ython裝飾器的語法回顧一下。 @d...
摘要:裝飾器是可調(diào)用的對(duì)象,其參數(shù)是另一個(gè)函數(shù)被裝飾的函數(shù)。第二大特性是,裝飾器在加載模塊時(shí)立即執(zhí)行。另一個(gè)常見的裝飾器是,它的作用是協(xié)助構(gòu)建行為良好的裝飾器。 裝飾器是可調(diào)用的對(duì)象,其參數(shù)是另一個(gè)函數(shù)(被裝飾的函數(shù))。 裝飾器基礎(chǔ)知識(shí) 首先看一下這段代碼 def deco(fn): print I am %s! % fn.__name__ @deco def func(): ...
摘要:概括的講,裝飾器的作用就是為已經(jīng)存在的函數(shù)或?qū)ο筇砑宇~外的功能。在理解這些裝飾器之前,最好對(duì)函數(shù)的閉包和裝飾器的接口約定有一定了解。是一個(gè)非常簡(jiǎn)單的裝飾器加強(qiáng)包。 Python中的裝飾器是你進(jìn)入Python大門的一道坎,不管你跨不跨過去它都在那里。 為什么需要裝飾器 我們假設(shè)你的程序?qū)崿F(xiàn)了say_hello()和say_goodbye()兩個(gè)函數(shù)。 def say_hello(): ...
小編寫這篇文章的一個(gè)主要目的,主要是來給大家詳細(xì)解答一些關(guān)于Python Decorator的相關(guān)知識(shí),涉及到的內(nèi)容主要是關(guān)于裝飾器的一些介紹,比如,裝飾器的一些常見創(chuàng)建方法,還有一些具體的場(chǎng)景,下面就給大家詳細(xì)解答下。 前言 1.裝飾器本質(zhì)是一個(gè)語法糖,是對(duì)被裝飾方法或類進(jìn)行的功能擴(kuò)充,是一種面向切面的實(shí)現(xiàn)方法 2.裝飾器可以分成方法裝飾器和類裝飾器,他們的區(qū)別是一個(gè)是用函數(shù)實(shí)現(xiàn)的裝飾...
閱讀 1854·2023-04-25 14:49
閱讀 3134·2021-09-30 09:47
閱讀 3131·2021-09-06 15:00
閱讀 2240·2019-08-30 13:16
閱讀 1456·2019-08-30 10:48
閱讀 2688·2019-08-29 15:11
閱讀 1305·2019-08-26 14:06
閱讀 1685·2019-08-26 13:30