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...