super(Child, self).method(args)
Parent.method(self, args)
我用其中的一種報了如下錯誤:
找不到 classobj。當我把調用改為 super(B, self).f(name)
就能正確運行,且結果正確。
分析錯誤
因為基類沒有繼承 object , 在python中,一個可以這樣創建:
1
2
|
class A: pass |
也可以這樣創建:
1
2
|
class A( object ): pass |
這兩者的區別就是:
這是老式類(前者)和新式類(后者)的區別。區別可以參考:https://docs.python.org/release/2.5.2/ref/node33.html
python3已經把舊類型去掉了,也就是說已經隱式繼承了object,所以,python3中寫不寫繼承object都是沒有區別的
兩種調用的區別
Parent.__init__(self)
與 super(Child, self).__init__()
的區別是什么?
super 理解成父類也是理所當然,python里其實指的是 MRO 中的下一個類!
super其實干了這件事,看這個答案:
1
2
3
|
def super ( cls , inst): mro = inst.__class__.mro() # Always the most derived class return mro[mro.index( cls ) + 1 ] |
MRO 全稱 Method Resolution Order,它代表了類繼承的順序。
super 是用來解決多重繼承問題的,假設B C D 都是直接繼承class A
1
2
3
|
class E(B, C, D): def __init__( self ): # code... |
如果E類的構造函數使用 super(E, self).__init__()
時,A類的構造函數會被執行一次,而用另一種方法,A類的構造函數會被執行多次。
在 MRO 中,基類永遠出現在派生類后面,如果有多個基類,基類的相對順序保持不變。
總結
個人覺得,復雜的繼承結構是設計中不良的設計,當繼承結構清晰后,兩個方法其實就沒什么區別了。以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助。
原文鏈接:https://www.hongweipeng.com/index.php/archives/1065/