python 多重繼承

2021-07-12 00:22:29 字數 1758 閱讀 4372

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

對經典類和新式類來說,屬性的查詢順序是不同的。現在我們分別看一下經典類和新式類兩種不同的表現:

經典類:

#

! /usr/bin/python

#-*- coding:utf-8 -*-

class

p1():

deffoo(self):

print

'p1-foo

'class

p2():

deffoo(self):

print

'p2-foo

'def

bar(self):

print

'p2-bar

'class

c1(p1,p2):

pass

class

c2(p1,p2):

defbar(self):

print

'c2-bar

'class

d(c1,c2):

pass

if__name__ =='

__main__':

d=d()

d.foo()

d.bar()

執行的結果:

p1-foo

p2-bar

將**例項,畫了乙個圖,方便理解:

從上面經典類的輸出結果來看,

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

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

新式類:

#

! /usr/bin/python

#-*- coding:utf-8 -*-

class

p1(object):

deffoo(self):

print

'p1-foo

'class

p2(object):

deffoo(self):

print

'p2-foo

'def

bar(self):

print

'p2-bar

'class

c1(p1,p2):

pass

class

c2(p1,p2):

defbar(self):

print

'c2-bar

'class

d(c1,c2):

pass

if__name__ =='

__main__':

print d.__mro__ #只有新式類有__mro__屬性,告訴查詢順序是怎樣的

d=d()

d.foo()

d.bar()

執行的結果:

(, , , , , )

p1-foo

c2-bar

從上面新式類的輸出結果來看,

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

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

總結:新式類的搜尋方式是採用「廣度優先」的方式去查詢屬性。

Python多重繼承

class printa namea printa def set value self,a self.a a def set namea self,namea printa.namea namea def info self print printa s,s printa.namea,self.a...

python多重繼承

class d object pass class c d pass class b d pass class a b,c pass mro method resolution order 方法解析順序 為了解決多繼承問題 在inspect檔案中 採用aov圖,每次輸出乙個入度為零的點 相當於沒有人...

Python 多重繼承

class a object def test self print aaa class b object def test self print b中的test 方法 def test2 self print bbb 在python中是支援多重繼承的,也就是我們可以為乙個類同時指定多個父類 可以在...