比如
class Child(Parent): def __init__(self): Parent.__init__(self)
回複內容:
針對你的問題,答案是可以,並沒有區別。但是這題下的回答我感覺都不夠好。
要談論 super,首先我們應該無視 "super" 這個名字帶給我們的幹擾。
不要一說到 super 就想到父類!super 指的是 MRO 中的下一個類!
不要一說到 super 就想到父類!super 指的是 MRO 中的下一個類!
不要一說到 super 就想到父類!super 指的是 MRO 中的下一個類!
一說到 super 就想到父類這是初學者很容易犯的一個錯誤,也是我當年犯的錯誤。
忘記了這件事之後,再去看這篇文章:Python’s super() considered super!
這是 Raymond Hettinger 寫的一篇文章,也是全世界公認的對 super 講解最透徹的一篇文章,凡是討論 super 都一定會提到它(當然還有一篇 Python's Super Considered Harmful)。
如果不想看長篇大論就去看這個答案
,super 其實乾的是這件事:
def super(cls, inst): mro = inst.__class__.mro() return mro[mro.index(cls) + 1]
super 是用來解決多重繼承問題的,直接用類名調用父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到尋找順序(MRO)、重複調用(鑽石繼承)等種種問題。
總之前人留下的經驗就是:保持一致性。要不全部用類名調用父類,要不就全部用 super,不要一半一半。
如果沒有複雜的繼承結構,super 作用不大。而複雜的繼承結構本身就是不良設計。對於多重繼承的用法,現在比較推崇 Mixin 的方式,也就是
- 普通類多重繼承只能有一個普通父類和若干個 Mixin 類(保持主幹單一)
- Mixin 類不能繼承普通類(避免鑽石繼承)
- Mixin 類應該單一職責(參考 Java 的 interface 設計,Mixin 和此極其相似,只不過附帶實現而已)
如果按照上述標準,只使用 Mixin 形式的多繼承,那麼不會有鑽石繼承帶來的重複方法調用,也不會有複雜的尋找順序 —— 此時 super 是可以有無的了,用不用全看個人喜好,只是記得千萬別和類名調用的方式混用就好。某個時候你覺得Parent名字不好了,改成MyParent,結果不得不把每個子類都改一遍
另外給一個類獲得父類只能用super,比如:
def get_super(cls):super(A,self).func 不是把A的父類的func執行,而是把A的父類的類類型序列中的所有類型的func都執行一次。http://blog.csdn.net/johnsonguo/article/details/585193
這裡面寫的挺好的,可以參考下@laike9m 的解釋很到位了,我想說:貌似沒法解決參數傳遞問題啊,只能用python所謂的魔法,把參數全部傳遞過去,可是兩個類,作者不同,什麼事情都能發生,參數名重複呢,感覺python這個機制不怎麼樣正好第一次接觸到這問題,搬運工
inheritance - Understanding Python super() with __init__() methods