python的多重繼承

2021-07-12 00:17:14 字數 1762 閱讀 4364

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的多重繼承

在設計類的繼承關係時,通常,主線都是單一繼承下來的,如果需要 混入 額外的功能,通過多重繼承就可以實現,這種設計通常稱之為mixin。class animal object pass class mammal animal pass class runnable object def run sel...

python 多重繼承

python和c 一樣,支援多繼承。概念雖然容易,但是困難的工作是如果子類呼叫乙個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。對經典類和新式類來說,屬性的查詢順序是不同的。現在我們分別看一下經典類和新式類兩種不同的表現 經典類 usr bin pyth...

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