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