在上一次的推送《Python 監(jiān)控文件事件變化—以音樂(lè)高潮提取為例》中,最后繼承 LoggingEventHandler 類(lèi),對(duì) on_created 進(jìn)行修改的時(shí)候,我使用了一個(gè)詞叫:重載,隨后不久我便意識(shí)到犯下了一個(gè)錯(cuò)誤。
我們先來(lái)看看重載與重寫(xiě)的概念:
重載:
重載的條件如下:
1.一個(gè)類(lèi)里面
2.方法名字相同
3.參數(shù)不同
而參數(shù)不同可分為:參數(shù)類(lèi)型不同,參數(shù)個(gè)數(shù)不同。而上一次推送中,對(duì)on_created的修改并沒(méi)有針對(duì)參數(shù),我們只是單純地對(duì)函數(shù)內(nèi)容進(jìn)行修改而已。因此只能叫 重寫(xiě) 。
重寫(xiě):
條件如下:
1.參數(shù)列表與原函數(shù)一致。
2.返回類(lèi)型與原函數(shù)一致。
因此,根據(jù)這個(gè)條件,Python中絕大部分的繼承修改只能叫 重寫(xiě) ,而不能叫 重載 。
Python其實(shí)不需要重載這個(gè)概念。為什么呢?重載主要是針對(duì)參數(shù)而言的,一個(gè)是改變參數(shù)的類(lèi)型,一個(gè)是改變參數(shù)的個(gè)數(shù)。而Python不需要限定參數(shù)類(lèi)型,又 可以接受可變參數(shù),因此函數(shù)重載就顯得非常雞肋了。
不過(guò)我們依然能通過(guò)singledispatch
裝飾器來(lái)實(shí)現(xiàn)重載,不過(guò)官方稱(chēng)這樣的函數(shù)為泛型函數(shù),官方文檔:
https://docs.python.org/3/library/functools.html#functools.singledispatch
使用方法:
在需要被重載的函數(shù)上加上裝飾器:
然后用register屬性注冊(cè)重載后的函數(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í)候都不會(huì)用到這個(gè)功能。
-
參數(shù)
+關(guān)注
關(guān)注
11文章
1865瀏覽量
32833 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4367瀏覽量
64050 -
python
+關(guān)注
關(guān)注
56文章
4823瀏覽量
86061
發(fā)布評(píng)論請(qǐng)先 登錄
Python
函數(shù)重載隱藏覆蓋的區(qū)別
漫談java中重載與重寫(xiě)的不同
java構(gòu)造函數(shù)重載定義
python基礎(chǔ)教程之python是什么?概念解析

評(píng)論