python2和python3的繼承方式的不一樣,廣度優先和深度有限

腳踏黃土,頭頂清風,不道苦楚,莫問前程!!!


參考文章三篇

簡書第一篇簡書第二篇博客園的文章,這篇博客園文章講的很好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--->B----->A----->C(深刻繼承樹左側查找)

廣度優先

如今構造函數的繼承狀況爲:
若D類有構造函數,則重寫全部父類的繼承
若D類沒有構造函數,B類有構造函數,則D類會繼承B類的構造函數
若D類沒有構造函數,B類也沒有構造函數,則D類會繼承 C類 的構造函數,而 不是A類 的構造函數(新式類繼承順序,詳見下面代碼)
若D類沒有構造函數,B類也沒有構造函數,C類也沒有構造函數,則D類纔會繼承A類的構造函數
繼承的順序結構爲 D---->B----->C------->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'>)
相關文章
相關標籤/搜索