python中使用@
放在函數上方便定義一個裝飾器
,不少朋友以爲使用裝飾器太魔幻,始終不知道怎麼靈活使用。python
要想作到靈活使用,得首先明白它的本質。今天,我試着用最通俗的語言,幾行代碼和小例子來解釋裝飾器的本質
。web
2 小例子算法
這是一個裝飾器:微信
def call_print(f):
def g():
print('you\'re calling %s function'%(f.__name__,))
return g
使用call_print
裝飾器:app
@call_print
def myfun():
pass
@call_print
def myfun2():
pass
myfun()後返回:echarts
In [27]: myfun()
you're calling myfun function
In [28]: myfun2()
you're calling myfun2 function
3 使用call_print機器學習
你看,@call_print
放置在任何一個新定義的函數上面,都會默認輸出一行,你正在調用這個函數的名。編輯器
這是爲何呢?注意觀察新定義的call_print
函數(加上@後即是裝飾器):函數
def call_print(f):
def g():
print('you\'re calling %s function'%(f.__name__,))
return g
它必須接受一個函數f
,而後返回另一個函數g
.學習
4 裝飾器本質
本質上,它與下面的調用方式效果是等效的:
def myfun():
pass
def myfun2():
pass
def call_print(f):
def g():
print('you\'re calling %s function'%(f.__name__,))
return g
下面是最重要的代碼:
myfun = call_print(myfun)
myfun2 = call_print(myfun2)
你們看明白嗎?也就是call_print(myfun)後不是返回一個函數嗎,而後再賦值給myfun.
再次調用myfun, myfun2時,效果是這樣的:
In [32]: myfun()
you're calling myfun function
In [33]: myfun2()
you're calling myfun2 function
你看,這與裝飾器的實現效果是如出一轍的。裝飾器的寫法可能更加直觀些,因此不用顯示的這樣賦值:myfun = call_print(myfun)
,myfun2 = call_print(myfun2)
,可是裝飾器的這種封裝,猛一看,有些很差理解。
怎麼樣,相信你會有一些收穫,恭喜你!這是個人原創,若是能夠,幫我分享一下吧。
近期小例子:pyecharts繪製詞雲圖;使用pillow處理圖片,很簡單!;slice對象的應用舉例;一行代碼優化異常輸出;函數的五類參數使用例子;繪製時間線輪播圖;python參數類型使用總結;繪製水球圖;lambda參數之坑;Python繪製儀表盤;參數的默認值陷阱!;chain串聯多個迭代對象;機器學習中會涉及到的隨機選擇樣本;使用namedtuple的小例子; pkuseg 作分詞,超級nice~; 寫一個裝飾器:統計異常發生次數和時間;對象可被調用的實現方法;求任意維度兩點間距離; 兩種合併字典的方法對比; 計算和聚合同時進行; groupby 分組; plotly畫柱狀圖+折線圖;
有收穫,點個在看;想要了解更多小例子,點擊閱讀原文
本文分享自微信公衆號 - Python與算法社區(alg-channel)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。