在上一次的推送《Python 監(jiān)控文件事件變化—以音樂高潮提取為例》中,最后繼承 LoggingEventHandler 類,對 on_created 進行修改的時候,我使用了一個詞叫:重載,隨后不久我便意識到犯下了一個錯誤。
我們先來看看重載與重寫的概念:
重載:
重載的條件如下:
1.一個類里面
2.方法名字相同
3.參數(shù)不同
而參數(shù)不同可分為:參數(shù)類型不同,參數(shù)個數(shù)不同。而上一次推送中,對on_created的修改并沒有針對參數(shù),我們只是單純地對函數(shù)內(nèi)容進行修改而已。因此只能叫 重寫 。
重寫:
條件如下:
1.參數(shù)列表與原函數(shù)一致。
2.返回類型與原函數(shù)一致。
因此,根據(jù)這個條件,Python中絕大部分的繼承修改只能叫 重寫 ,而不能叫 重載 。
Python其實不需要重載這個概念。為什么呢?重載主要是針對參數(shù)而言的,一個是改變參數(shù)的類型,一個是改變參數(shù)的個數(shù)。而Python不需要限定參數(shù)類型,又 可以接受可變參數(shù),因此函數(shù)重載就顯得非常雞肋了。
不過我們依然能通過singledispatch
裝飾器來實現(xiàn)重載,不過官方稱這樣的函數(shù)為泛型函數(shù),官方文檔:
https://docs.python.org/3/library/functools.html#functools.singledispatch
使用方法:
在需要被重載的函數(shù)上加上裝飾器:
然后用register屬性注冊重載后的函數(shù):
效果如下:
>>> fun(42, verbose=True)
Strengthin numbers, eh?42
>>> fun(['spam','spam','eggs','spam'], verbose=True)
Enumeratethis:
0 spam
1 spam
2 eggs
3 spam
看,這樣我們就順利完成了Python里的"重載",盡管大部分時候都不會用到這個功能。
-
參數(shù)
+關注
關注
11文章
1867瀏覽量
32874 -
函數(shù)
+關注
關注
3文章
4371瀏覽量
64229 -
python
+關注
關注
56文章
4825瀏覽量
86226
發(fā)布評論請先 登錄
Python
函數(shù)重載隱藏覆蓋的區(qū)別
漫談java中重載與重寫的不同
java構造函數(shù)重載定義
python基礎教程之python是什么?概念解析

評論