簡書第一篇 ,簡書第二篇,博客園的文章,這篇博客園文章講的很好html
經過繼承建立的新類稱爲「子類」或「派生類」,被繼承的類稱爲「基類」、「父類」或「超類」,繼承的過程,就是從通常到特殊的過程。在某些 OOP 語言中,一個子類能夠繼承多個基類。可是通常狀況下,一個子類只能有一個基類,要實現多重繼承,能夠經過多級繼承來實現
python2中經典類和新式類的繼承方式不一樣,經典類採用深度優先搜索的繼承,新式類採用的是廣度優先搜索的繼承方式 python3中經典類和新式類的繼承方式都採用的是都採用廣度優先搜索的繼承方式python
在Python 3.x中取消了經典類,默認都是新式類,而且沒必要顯式的繼承object,也就是說: class Person(object): pass class Person(): pass class Person: pass 三種寫法並沒有區別,推薦第一種
可是在Python2.x中,默認都是經典類,只有顯式繼承了object纔是新式類,即: class Person(object): pass 新式類寫法 class Person(): pass 經典類寫法 class Person: pass 經典類寫法
舉個例子來講明:現有4個類,A,B,C,D類,D類繼承於B類和C類,B類與C類繼承於A類。class D(B,C) 實例化D類less
如今構造函數的繼承狀況爲: 若D類有構造函數,則重寫全部父類的繼承 若D類沒有構造函數,B類有構造函數,則D類會繼承B類的構造函數 若D類沒有構造函數,B類也沒有構造函數,則D類會繼承 A類 的構造函數,而 不是C類 的構造函數(經典類繼承順序,詳見下面代碼) 若D類沒有構造函數,B類也沒有構造函數,A類也沒有構造函數,則D類纔會繼承C類的構造函數
如今構造函數的繼承狀況爲: 若D類有構造函數,則重寫全部父類的繼承 若D類沒有構造函數,B類有構造函數,則D類會繼承B類的構造函數 若D類沒有構造函數,B類也沒有構造函數,則D類會繼承 C類 的構造函數,而 不是A類 的構造函數(新式類繼承順序,詳見下面代碼) 若D類沒有構造函數,B類也沒有構造函數,C類也沒有構造函數,則D類纔會繼承A類的構造函數
super()方法只能用於新式類中 接下來就是super().__init__()的用法 python子類調用父類成員有2種方法,分別是普通方法和super方法 假設Base是基類函數
class Base(object): def __init__(self): print 「Base init」
則普通方法以下3d
class Leaf(Base): def __init__(self): Base.__init__(self) print 「Leaf init」
super方法以下code
class Leaf(Base): def __init__(self): super(Leaf, self).__init__() print 「Leaf init」
super不是父類,而是繼承順序的下一個類,在多重繼承時會涉及繼承順序,super()至關於返回繼承順序的下一個類,而不是父類,相似於這樣的功能:htm
def super(class_name, self): mro = self.__class__.mro() return mro[mro.index(class_name) + 1] #mro()用來得到類的繼承順序。 例如: class Base(object): def __init__(self): print 'Base create' class childA(Base): def __init__(self): print 'enter A ' # Base.__init__(self) super(childA, self).__init__() print 'leave A' class childB(Base): def __init__(self): print 'enter B ' # Base.__init__(self) super(childB, self).__init__() print 'leave B' class childC(childA, childB): pass c = childC() print c.__class__.__mro__ #輸出: enter A enter B Base create leave B leave A (<class '__main__.childC'>, <class '__main__.childA'>, <class '__main__.childB'>, <class '__main__.Base'>, <type 'object'>)