由於此說:功能在Python超載:缺少
函數重載是在Python缺席。
就我覺得這是一個很大的障礙,因爲它也是面嚮對象語言。最初我發現無法區分參數類型是困難的,但Python的動態特性使它變得容易(例如,列表,元組,字符串非常相似)。
然而,計算通過的參數的數量,然後做這項工作就像是矯枉過正。
由於此說:功能在Python超載:缺少
函數重載是在Python缺席。
就我覺得這是一個很大的障礙,因爲它也是面嚮對象語言。最初我發現無法區分參數類型是困難的,但Python的動態特性使它變得容易(例如,列表,元組,字符串非常相似)。
然而,計算通過的參數的數量,然後做這項工作就像是矯枉過正。
由於放鬆指出,使用默認值的關鍵字參數可以走很長的路要走。
我還會說,在我看來,它違背了Python的精神,非常擔心什麼類型傳遞到方法。在Python中,我認爲使用鴨子打字更容易 - 詢問對象可以做什麼,而不是它是什麼。
因此,如果你的方法可能會接受一個字符串或一個元組,你可能會做這樣的事情:
def print_names(names):
"""Takes a space-delimited string or an iterable"""
try:
for name in names.split(): # string case
print name
except AttributeError:
for name in names:
print name
那麼你可以做以下任一:
print_names("Ryan Billy")
print_names(("Ryan", "Billy"))
雖然API像有時會表明設計問題。
通常情況下,您會看到建議使用use關鍵字參數與默認值相反。研究一下。
你不需要函數重載,因爲你有* args和** kwargs參數。
事實上,函數重載是基於這樣的想法,即傳遞不同的類型將執行不同的代碼。如果你有像python這樣的動態類型語言,你不應該按類型區分,但是你應該處理接口以及它們與你編寫的代碼的兼容性。例如,如果您有可以處理整數或整數列表的代碼,則可以嘗試對其進行迭代,如果無法執行此操作,則假定它是整數並繼續前進。當然,它可能是一個浮點數,但就行爲而言,如果float和int看起來相同,那麼它們可以互換。
你可以將一個可變容器數據類型傳遞給一個函數,它可以包含任何你想要的東西。
如果你需要一個不同的功能,不同的命名功能,或者如果ü需要一個相同的接口,只寫調用適當的基於數據的功能獲得了接口函數(或方法)。
過了好一會兒給我逐漸適應了這種從Java的到來,但它真正地不是一個「大障礙」
現在,除非你想用Python語法編寫C++代碼,你會是什麼需要重載?
我認爲這完全相反,重載只是使強類型語言更像Python一樣行事。在Python中你有關鍵字參數,你有*args
和**kwargs
。
見例如:What is a clean, pythonic way to have multiple constructors in Python?
那麼,你認爲你需要超載的是什麼? – kquinn 2009-04-09 07:59:15
投票結束不是一個真正的問題。這並不是說它不是一個潛在的有效點,但它不是一個問題。 – 2009-04-09 08:01:02
那麼,然後使用一種語言,提供重載... – 2009-04-09 09:39:22