我對裝飾器的一些通俗理解,或許能幫助到你~

1 寫在前面

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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索