Python中既然可以直接通過父類名調用父類方法為什麼還會存在super函數?

來源:互聯網
上載者:User
比如

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
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.