2012-02-08 64 views
3

我對Java中的OOP及其成語有深刻的理解。Python中的多繼承與組合

現在我編碼在python中,而我處於多重繼承可能有用的情況,然而(這可能是由於多年的java代碼),我不願意這樣做,我正在考慮使用而不是繼承,以避免與潛在的平等方法名稱的潛在衝突。

問題是,我是否嚴格或過於關注這個東西的Java焦點。或者在python中使用多重繼承不僅是可能的,而且也是鼓勵的。

感謝您的時間:)

+8

在Python你有[MRO(http://python.net/crew/timehorse/BFS_vs_MRO.html)來處理名稱衝突。 BTW閱讀[那](http://dirtsimple.org/2004/12/python-is-not-java.html) – JBernardo 2012-02-08 04:45:18

+1

+1給JBernardo,我同意。衝突的方法名稱並不是避免多重繼承的原因,因爲Python有一個非常乾淨,定義明確的「啄食順序」,在發生衝突時該方法會被繼承。只要確定你知道它是什麼。 – 2012-02-08 05:54:14

回答

1

「繼承與組合」的問題歸結爲嘗試解決可重用代碼的問題。你不想在你的代碼中重複使用代碼,因爲這不是乾淨而高效的。繼承通過創建一個機制讓你在基類中具有隱含的特性來解決這個問題。組合通過給你模塊和簡單地調用其他類中的函數來解決這個問題。

如果兩種解決方案都解決了重用問題,那麼哪種解決方案適用於哪種情況?答案是令人難以置信的主觀,但我會給你我的三個指導方針:

  1. 不惜一切代價避免多重繼承,因爲它太複雜,不能可靠地使用。如果你堅持不懈,那麼就要準備好了解班級的層次結構,並花時間找出所有事情的來源。
  2. 使用組合將代碼打包成模塊,用於許多不同的不相關的地方和情況。
  3. 只有在明確相關的可重用代碼片段符合一個通用概念時,或者因爲您正在使用的某些東西而必須使用時,才使用繼承。

但是,不要成爲這些規則的奴隸。關於面向對象編程需要記住的是,它完全是程序員創建的用於打包和共享代碼的社交約定。由於這是一個社交慣例,但是它是用Python編寫的,所以你可能會因爲與你一起工作的人而被迫避開這些規則。在這種情況下,瞭解他們如何使用,然後才適應這種情況。

更多細節上可以找到:http://learnpythonthehardway.org/book/ex44.html

+0

該鏈接位於付費牆後面。 clickbait? – andrei 2017-11-28 00:45:57

2

我還是寧願組成繼承,無論是多個或單個。真的進入鴨子打字有點像在各處都有隱式接口的加載,所以你甚至不需要繼承(或抽象類)在Python中非常多。但這是寧願組成,而不是從來沒有使用繼承。如果繼承(甚至是多個)很適合並且組合不是,那麼就使用繼承。