Python 多繼承方式及順序

2022-07-23 13:27:32 字數 2060 閱讀 6208

在看本篇之前,需要先了解兩個概念:深度優先、廣度優先。

深度優先和廣度優先是兩種不同的演算法策略,兩者有什麼區別呢?我直接上**釋吧。

如圖,b 繼承 a, c 繼承 a, d 繼承 b 和 c。

tips:py2 經典類是按深度優先來繼承的,新式類是按廣度優先來繼承的。

py3 經典類和新式類都是統一按廣度優先來繼承的。

先定義幾個類,b 繼承 a, c 繼承 a, d 繼承 b 和 c

class

a():

def__init__

(self):

print("a"

)class

b(a):

def__init__

(self):

print("b"

)class

c(a):

def__init__

(self):

print("c"

)class

d(b,c):

def__init__

(self):

print("

d")

view code

當 d 裡面沒有引數時,到父類裡找。我們知道,d 的父類是 b 和 c,且定義的順序是 b在左,c在右。驗證以下**後,可以看到,繼承順序是從左到右的

class

a():

def__init__

(self):

print("a"

)class

b(a):

def__init__

(self):

print("b"

)class

c(a):

def__init__

(self):

print("c"

)class

d(b,c):

pass

#def __init__(self):

#print("d")

d()

#d裡面沒有,則找父類(從左往右),找到b

#b

view code

當 b 裡面也沒有引數時,d 就找父類 c

class

a():

def__init__

(self):

print("a"

)class

b(a):

pass

#def __init__(self):

#print("b")

class

c(a):

def__init__

(self):

print("c"

)class

d(b,c):

pass

#def __init__(self):

#print("d")

d()

#c

view code

那麼,當 b 和 c裡都沒有引數時,d該找誰呢?------答案是: a

class

a():

def__init__

(self):

print("a"

)class

b(a):

pass

#def __init__(self):

#print("b")

class

c(a):

pass

#def __init__(self):

#print("c")

class

d(b,c):

pass

#def __init__(self):

#print("d")

d()#

a

view code

- end -

Python多繼承方式及順序

python2中經典類使用的是深度優先,新式類使用的是廣度優先 python3經典類與新式類都是廣度優先。一圖以蔽之 如圖,b 繼承 a,c 繼承 a,d 繼承 b 和 c。上 coding utf 8 class p1 pass def foo self print p1 foo class p2...

多繼承及MRO順序

super init 相對於類名.init,在單繼承上用法基本 差 但在多繼承上有區別,super方法能保證每個父類的方法只會執行一次,而使用類名的方法會導致方法被執行多次 多繼承時,使用super方法,對父類的傳引數,應該是由於python中 super的演算法導致的原因,必須把引數全部傳遞,否則...

Python 多繼承中MRO順序

在python3 裡面,使用super當有多繼承的情況出現的時候,有時候會出現呼叫父類init呼叫不到,因為在python3 裡面有乙個預設來處理類之間呼叫順序的c3 演算法,c3用來保證每個類只呼叫一次的演算法,所有通過super 來進行呼叫的時候都會根據裡面的順序來進行呼叫 在類中可以通過 cl...