python 之 多繼承的順序

2021-08-19 15:30:44 字數 1634 閱讀 3279

python 支援多繼承,但對與經典類和新式類來說,多繼承查詢的順序是不一樣的。

經典類:

新式類

classp1:

deffoo(

self

):           

print

'p1-foo'

class

p2 :

deffoo(

self

): print

'p2-foo'

defbar(

self

): print

'p2-bar'

class

c1 (p1,p2): 

pass

class

c2 (p1,p2): 

defbar(

self

): print

'c2-bar'

class

d(c1,c2): 

pass

class

p1(object)

:def

foo(

self

):           

print

'p1-foo'

class

p2(object)

:def

foo(

self

): print

'p2-foo'

defbar(

self

): print

'p2-bar'

class

c1 (p1,p2): 

pass

class

c2 (p1,p2): 

defbar(

self

): print

'c2-bar'

class

d(c1,c2): 

pass

1. 經典類

d = d()

d.foo() 

# 輸出 p1-foo 

d.bar() 

# 輸出 p2-bar 

例項d呼叫foo()時,搜尋順序是 d => c1 => p1

例項d呼叫bar()時,搜尋順序是 d => c1 => p1 => p2

換句話說,經典類的搜尋方式是按照「從左至右,深度優先

」的方式去查詢屬性。d先查詢自身是否有foo方法,沒有則查詢最近的父類c1裡是否有該方法,如果沒有則繼續向上查詢,直到在p1中找到該方法,查詢結束。

2. 新式類

d=d() 

d.foo() 

# 輸出 p1-foo 

d.bar() 

# 輸出 c2-bar 

例項d呼叫foo()時,搜尋順序是 d => c1 => c2 => p1

例項d呼叫bar()時,搜尋順序是 d => c1 => c2

可以看出,新式類的搜尋方式是採用「廣度優先」的方式去查詢屬性。

python之多重繼承

因為繼承可以獲取父類的屬性以及函式,所以繼承在物件導向程式設計中是乙個重要的方式,但是,如果物件中的繼承關係過多,就會導致繼承層次太多,因此出現了多重繼承的概念,即繼承不再是一對一,而是可以乙個子類繼承多個父類的方式,方法就是在類後面的括號用逗號隔開每乙個繼承類 如下 class animal ob...

python 多繼承 python 繼承之多繼承

class baserequest pass class requesthandler baserequest def serve forever self print requesthandler.serve forever self.process request def process req...

Python物件導向之多繼承

class terrestrialanimal def activy self print 可以在陸地上運動 def breath self print 使用肺呼吸 def eat self print 可以吃東西 class aquaticanimal def activy self print ...