摘要:屬性,可以函數(shù)的名字在代碼運行期間動態(tài)增加功能的方式,稱之為裝飾器。本質(zhì)上,就是一個返回函數(shù)的高階函數(shù)。比如,定義一個能打印日志的。接受函數(shù)作為參數(shù),要放置在函數(shù)定義處。一個完整的的代碼如下記錄的是傳入的的值,位置在嵌套內(nèi)或者帶參數(shù)的如下。
又是一段叨叨
如果總是擔心能不能做到的話,那就干脆不要做了。
想做的事情還是一往無前的好,什么都不想,就努力沖沖沖吧!
因為函數(shù)是一個對象。
所以。
__name__屬性,可以get函數(shù)的名字.
在代碼運行期間動態(tài)增加功能的方式,稱之為“裝飾器”(Decorator)。本質(zhì)上,decorator就是一個返回函數(shù)的高階函數(shù)。
比如,定義一個能打印日志的decorator。
def log(func): def wrapper(*args, **kw): print("call %s():" % func.__name__) return func(*args, **kw) return wrapper
log接受函數(shù)作為參數(shù),要放置在函數(shù)定義處。
@log def now(): print("2015-3-25")
這樣調(diào)用now()的時候,就會先打印出程序名稱。
把@log放到now()函數(shù)的定義處,相當于執(zhí)行了語句
now = log(now)
由于log()是一個decorator,返回一個函數(shù),所以,原來的now()函數(shù)仍然存在,只是現(xiàn)在同名的now變量指向了新的函數(shù),于是調(diào)用now()將執(zhí)行新函數(shù),即在log()函數(shù)中返回的wrapper()函數(shù)。【此時的now已經(jīng)不是原來的now了,只是個同名的朋友】
當需要再進一步的時候,比如decorator本身需要傳入?yún)?shù),就需要再改造下函數(shù)。
這個三層嵌套的效果如下:
now = log("execute")(now)
但是也存在問題,因為函數(shù)的名字now.__name__此時已經(jīng)變成了wrapper,所以需要把原始函數(shù)的名稱等屬性復(fù)制到wrapper()中,否則一些依賴于函數(shù)簽名的代碼執(zhí)行就會出錯。
Python內(nèi)置的functools.wraps就可以用來處理這個問題。
一個完整的decorator的代碼如下:
import functools def log(func): @functools.wraps(func) #記錄的是傳入的func的值,位置在嵌套內(nèi) def wrapper(*args, **kw): print("call %s():" % func.__name__) return func(*args, **kw) return wrapper
或者帶參數(shù)的如下。
import functools def log(text): def decorator(func): @functools.wraps(func) #記錄的是傳入的func的值,位置在嵌套內(nèi) def wrapper(*args, **kw): print("%s %s():" % (text, func.__name__)) return func(*args, **kw) return wrapper return decorator
@functools.wraps(func)加上這句很重要。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/42900.html
摘要:好久不見最近都在忙年底的年會,還沉迷于學習統(tǒng)計學,教程還停留在基礎(chǔ)語法。做題做題無論如何,數(shù)據(jù)結(jié)構(gòu)還是很重要的,所以準備每天刷的題目啦。第一題移除元素給定一個數(shù)組和一個值,你需要原地移除所有數(shù)值等于的元素,返回移除后數(shù)組的新長度。 好久不見 最近都在忙年底的年會,還沉迷于學習統(tǒng)計學,python教程還停留在基礎(chǔ)語法。但是仔細規(guī)劃了下,還是要好好的瞄準目標前行。所以準備呢,實戰(zhàn)走起來。 ...
摘要:例如做累加,函數(shù)生成整數(shù)序列,函數(shù)轉(zhuǎn)換成。因為不能重復(fù),所以中沒有重復(fù)的。創(chuàng)建,需要提供一個作為輸入合集。重復(fù)元素在中自動被過濾。添加元素,重復(fù)添加無效果刪除元素 寫在前面的一點羅里吧嗦小嘮叨昨晚的python看到了快12點吧,然后進度相對來說還算滿意,只能說一點點推進,慶幸自己的大學還是一個比較認真的小碼農(nóng),現(xiàn)在撿起來還算比較得心應(yīng)手(pia飛自己,算法什么的還沒到好嗎?。┖煤脤W習唄...
摘要:直接抄其中一份的結(jié)論吧各地區(qū)招聘公司數(shù)量和平均待遇??梢钥闯霾徽撌钦衅腹镜臄?shù)據(jù)還是平均待遇水平主要都是北上廣深杭州占優(yōu)勢。但事實證明,總是要有一些代價的。要學會看報錯信息。函數(shù)定義結(jié)束后需要按兩次回車重新回到提示符下。 又是寫在前面的亂七八糟 持續(xù)學習的第三天了,持續(xù)學習是一個不容易培養(yǎng)的好習慣,但是堅持就是勝利嘛~昨天因為一點點事情,所以沒能學習很長時間,今天要補回來。周末要搬家,...
摘要:默認參數(shù)設(shè)置默認參數(shù)時,有幾點要注意一是必選參數(shù)在前,默認參數(shù)在后,否則的解釋器會報錯二是如何設(shè)置默認參數(shù)。注意此處,獲得的其實是的拷貝,函數(shù)內(nèi)對的改變不會影響到。使用遞歸函數(shù)需要注意防止棧溢出。 總是在最前面的叨逼叨 最近總是在想成長這兩個很常常被提起的事情,這對于一個已經(jīng)25歲的半中年而言,已經(jīng)是一個不太能高頻提起的詞。但是,最近一些事情吧,總讓我覺得我的生長期似乎比正常人來的晚了...
摘要:迭代器可以直接作用于循環(huán)的對象統(tǒng)稱為可迭代對象??梢员缓瘮?shù)調(diào)用并不斷返回下一個值的對象稱為迭代器。這個高階函數(shù),關(guān)鍵在于正確實現(xiàn)一個篩選函數(shù)。 又是日常嘮嗑的一小段 真的是非常話嘮的在下,日常給自己打點雞血吧。昨晚和老媽聊了一整晚,所以昨天并沒有更新。然后因為很快要開始算個稅減免的部分,對于溫飽線的在下而言,其實減免的可能就只是奶茶錢吧。工作的本質(zhì)是賺錢,我也很想在30歲之前完成財務(wù)自...
閱讀 2563·2021-11-15 18:14
閱讀 1770·2021-10-14 09:42
閱讀 3834·2021-10-11 10:58
閱讀 4026·2021-10-09 09:44
閱讀 2534·2021-09-26 09:55
閱讀 2530·2021-09-24 10:38
閱讀 2090·2021-09-04 16:48
閱讀 3325·2021-09-02 15:21