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