python繼承順序

2021-07-23 16:21:00 字數 947 閱讀 5357

python和c++一樣,支援多繼承。概念雖然容易,但是困難的工作是如果子類呼叫乙個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。

class p1 #(object): 

def foo(self):

print 'p1-foo'

class p2 #(object):

def foo(self):

print 'p2-foo'

def bar(self):

print 'p2-bar'

class c1 (p1,p2):

pass

class c2 (p1,p2):

def bar(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

2、新式類

使用新式類要去掉第一段**中的注釋

d=d() 

d.foo() # 輸出 p1-foo

d.bar() # 輸出 c2-bar

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

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

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

Python 繼承順序

class base def init self print base.init class a base def init self super init print a.init class b base def init self super init print b.init class c...

python 之 多繼承的順序

python 支援多繼承,但對與經典類和新式類來說,多繼承查詢的順序是不一樣的。經典類 新式類 classp1 deffoo self print p1 foo class p2 deffoo self print p2 foo defbar self print p2 bar class c1 p...

Python 多繼承中MRO順序

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