Python為什麼不支援函式過載?

2021-09-10 17:31:02 字數 1404 閱讀 4387

在考慮為什麼python不提供函式過載前,我們要研究為什麼需要提供函式過載。

在靜態語言中,方法過載是希望類可以以統一的方式處理不同型別的資料提供可能性。多個同名函式同時存在

函式過載主要解決兩個問題:

另外,乙個基本的設計原則是,僅僅當兩個函式除了引數型別和引數個數不同以外,其功能是完全相同的,此時才使用函式過載,如果兩個函式的功能其實不同,那麼不應當使用過載,而應當使用乙個名字不同的函式。

對於情況 1 ,函式功能相同,但是引數型別不同,python 如何處理?答案是根本不需要處理,因為 python 可以接受任何型別的引數,如果函式的功能相同,那麼不同的引數型別在 python 中很可能是相同的**,沒有必要做成兩個不同函式。

對於情況 2 ,函式功能相同,但引數個數不同,python 如何處理?大家知道,答案就是預設引數。對那些缺少的引數設定為預設引數即可解決問題。因為你假設函式功能相同,那麼那些缺少的引數終歸是需要用的。

鑑於情況1跟情況2都有了解決方案,python 自然就不需要函式過載了。

在靜態語言中,方法過載是希望類可以以統一的方式處理不同型別的資料提供可能。多個同名函式同時存在,具有不同的引數個數/型別,過載是乙個類中多型性的一種表現。

在動態語言中,有鴨子型別,如果走起路來像鴨子,叫起來也像鴨子,那麼它就是鴨子。乙個物件的特徵不是由它的型別決定,而是通過物件中的方法決定,所以函式過載在動態語言中就顯得沒有意義了,因為函式可以通過鴨子型別來處理不同型別的物件,鴨子型別也是多型性的一種表現。

在python中實現過載:

class

writer

: @staticmethod

defwrite

(output, content):

# output物件只要實現了write方法就行了

output.write(content)

# stringio型別

output = stringio.stringio(

)writer.write(output,

"helloworld"

)# file型別

output =

open

("out.txt"

,"w"

)writer.write(output,

"helloworld"

)

過載:函式名相同,函式的引數個數、引數型別或引數順序三者中必須至少有一種不同。函式返回值的型別可以相同,也可以不相同。發生在乙個類內部。

重定義:也叫做隱藏,子類重新定義父類中有相同名稱的非虛函式 ( 引數列表可以不同 ) ,指派生類的函式遮蔽了與其同名的基類函式。發生在繼承中。

重寫:也叫做覆蓋,一般發生在子類和父類繼承關係之間。子類重新定義父類中有相同名稱和引數的虛函式。

為什麼C 支援函式過載,而C語言不支援函式過載?

函式過載 c 允許在同一作用域中宣告幾個功能類似的同名函式,這些同名函式的形參列表 引數個數 或 型別 或 順序 必須不同,常用來處理實現功能類似資料型別不同的問題。c c 中程式執行起來,需要經歷一下幾個階段 在鏈結時,面對add函式,func函式,每個編譯器都有自己的函式名修飾規則。聯結器會使用...

為什麼模板不支援分離編譯?

在c 中,為了乙個專案的規範化我們通常把 歸類為三類 宣告檔案 實現檔案 測試檔案。比如,我們要實現乙個順序表,那麼規範化就是建立3個檔案 seqlist.h 順序表相關宣告 seqlist.cpp 順序表相關實現 test.cpp 順序表測試檔案 那麼普通順序表這樣寫一點問題都沒有,用模板實現成這...

為什麼模板不支援分離編譯

在c 中,為了乙個專案的規範,我們通常把 歸為三類 宣告檔案 實現檔案 測試檔案.比如,我要用c 實現乙個鍊錶,那麼就會建立這3個檔案 linklist.h 鍊錶的相關宣告 linklist.cpp 鍊錶的實現 test.cpp 鍊錶測試 本文忽略 那麼問題來了,普通鍊錶這樣寫起來一點問題都沒有 如...