Python 類裝飾器,使用小演示

三步加星標(biāo)
實現(xiàn)同樣一個功能,用Java語言可能得50行,而用Python可能只需10行,可能很多讀者在沒有學(xué)Python前,就從用過Python的前輩那里,聽說過這個,然后自己也開始去學(xué)Python的。
Python的確簡潔、優(yōu)雅,很多讀者包括我,都為之著迷。
今天通過一個小例子,再次認(rèn)識Python的clean之道:
我們想要檢查每個參數(shù),確保不能出現(xiàn)整數(shù)類型。使用類裝飾器,便能做到clean,通用:
import?functools
class?ValidateParameters:
????def?__init__(self,?func):
????????#?確保func被裝飾后函數(shù)信息不被改變
????????functools.update_wrapper(self,?func)
????????self.func?=?func
????#?重寫此方法,讓類對象變得可調(diào)用
????def?__call__(self,?*parameters):
????????if?any([isinstance(item,?int)?for?item?in?parameters]):
????????????raise?TypeError("Parameter?shouldn't?be?int!!")
????????else:
????????????return?self.func(*parameters)
使用上面的類,開始裝飾我們的各種函數(shù),比如連接字符串函數(shù) concat,第一次調(diào)用傳參都為字符串,類型滿足要求;第二次調(diào)用傳參有整數(shù)類型,拋出異常:Parameter shouldn't be int!!
@ValidateParameters
def?concat(*list_string):
????return?"".join(list_string)
#??returns?anb
print(concat("a",?"n",?"b"))
#?raises?Error.
print(concat("a",?1,?"c"))
任意一個想要有類型檢查的函數(shù),都可以裝飾上ValidateParemeters,如下capital函數(shù),實現(xiàn)串聯(lián)字符串后,且首字母大寫:
@ValidateParameters
def?capital(*list_string):
????return?concat(*list_string).capitalize()
print(capital("a",?"n",?"b"))
print(capital(2,?"n",?"b"))
如果輸入?yún)?shù)有整型,必然拋出上面的異常,再次方便的實現(xiàn)類型檢查。
以上使用Python類裝飾器,實現(xiàn)代碼clean的一個小演示。
常用的如Pandas、TensorFlow、Keras等框架,里面的源碼,都能看到類似用法,這類語法讓Python真正做到clean.
要想掌握Python,需要由表及里,不斷深入理解。今年,我大概花費4個多月時間,整理了20個Python核心專題,非常適合入門的讀者,下面列舉幾個章節(jié)的目錄:



掌握理解這20個專題后,再去看看幾本有深度的Python教程,相信那時你就是專家。
以上這20個專題PDF,還有需要的微信我,備注 專題:
