淡江大學

#新手 Python入門-多重繼承問題及用途

2020年7月3日 21:46
我最近練習Python的繼承時,遇到些問題想請教各位大佬: 1.一般super是繼承的時候才需要用到,為什麼A與B的__init__要再寫一次(繼承)自己呢? 2.為什麼第二張圖13行是直接寫super(C,self),而非分別寫super(A,self)、super(B,self)。以及super()內都不寫是等同於super(C,self)嗎? 3.為什麼印出的結果順序是B-A-C,不是應該看11行的傳入順序「A-B-C」嗎?
-------- 問題4.(也就是練習題原始問題) 題目要求傳參數,我自己實作有更動2.4.7.9行,但13行只能傳入變數testA,輸入兩個就出錯,要如何實作呢? 我改成下面這樣會出錯,請大佬們教學
PS. 多重繼承感覺好複雜,我讀的那本入門Python提到很多語言連多重繼承都不加入,實際上有什麼情況需要多重繼承呢?
愛心
18
留言 5
文章資訊
共 5 則留言
國立高雄科技大學
寫了那麼久也沒搞清楚過,卡一個等大神
國立臺灣大學 資訊工程學系
不是大佬,分享一點淺見 回答你的問題之前,先很快講一下 super() 的原理 和一個前置知識:Method Resolution Order(mro) mro 可以想成是搜索函數時的類別序列 以你的情況而言,可以透過 C.mro() 來調用查看 應該會看到 [C, A, B, object] 想更深入瞭解的話可以再去查查相關資料 而 super() 確實與 super(type, self)相同 它會從 self 的 mro 中,也就是 [C, A, B, object] 找到「位在 type 之後」且是「self 的父類」的類別實例 以你的例子來說 super(C, self) 是 A super(B, self) 和 super(A, self) 則分別是 object 和 B 回到問題 1、 呼叫 super() 是為了尋找從 mro 中尋找下一個實例 並調用它的 __init__ 方法,不是為了繼承自己 2、3、 整個呼叫的順序是這樣
4、 2 4 7 9 行的變動都是正確的 你需要修正的是傳入參數的地方 如上圖所示 13 行的參數會傳入第 2 行,第 3 行的則會傳到第 7 行 其他更偏物件導向的語言如 C# 及 Java 並不是不加入 而是它們引入了另個邏輯和規則相對明確乾淨的概念: 介面-來取代多重繼承的需求 至於實際上有什麼地方會用到 我不確定要從那個層面切入解釋 當你的應用和架構越來越龐大時 就會開始思考如何以物件導向來重構程式 當物件越來越多,想必你也會開始思考 一個同時具有 A 功能和 B 功能的新類別究竟該繼承誰 對 Python 不熟悉,如有錯誤還請多包容 🙂
其實有些語法存在歸存在,但不一定被鼓勵使用。比起會寫它,讀到知道意思就行了,畢竟,一個 code 寫完後,讀的次數遠比改寫它的次數大了許多。 不要糾結在這非必要的東西,繼續往前走吧。
class C(A, B) 繼承懶人包, 依照參數順序 一 C.__init__ 呼叫 super().__init, 即 A 二 A.__init__ 呼叫 super().__init, 即 B 三 B.__init__ 呼叫 super().__init 沒東西 到底惹, 跟遞迴一樣反向完成所有 __init__ A 的 __init__ 不寫 super 就找不到它下一個
多重繼承,在物件導向語言一直都有啊 只是java把他變形成interface了。 舉個栗子,今天有一個人是在美國出生的台灣人,有雙重國籍。請問他是要繼承美國人的身分還是,台灣人的身分? 當然兩個都會繼承啊。只是看你同一個member 最後是 declare 成什麼。