python 多重繼承

2022-03-02 12:14:10 字數 2393 閱讀 7668

除了從乙個父類繼承外,python允許從多個父類繼承,稱為多重繼承。

多重繼承的繼承鏈就不是一棵樹了,它像這樣:

class

a(object):

def__init__

(self, a):

print

'init a...

'self.a =a

class

b(a):

def__init__

(self, a):

super(b, self).

__init__

(a)

print

'init b...

'class

c(a):

def__init__

(self, a):

super(c, self).

__init__

(a)

print

'init c...

'class

d(b, c):

def__init__

(self, a):

super(d, self).

__init__

(a)

print

'init d...

'

看下圖:

像這樣,d 同時繼承自 b 和 c,也就是 d 擁有了 a、b、c 的全部功能。多重繼承通過 super()呼叫__init__()方法時,a 雖然被繼承了兩次,但__init__()只呼叫一次:

>>> d = d('d'

)init a...

init c...

init b...

init d...

多重繼承的目的是從兩種繼承樹中分別選擇並繼承出子類,以便組合功能使用。

舉個例子,python的網路伺服器有tcpserver、udpserver、unixstreamserver、unixdatagramserver,而伺服器執行模式有 多程序forkingmixin 和 多執行緒threadingmixin兩種。

要建立多程序模式的 tcpserver:

class

mytcpserver(tcpserver, forkingmixin)

pass

要建立多執行緒模式的 udpserver:

class

myudpserver(udpserver, threadingmixin):

pass

如果沒有多重繼承,要實現上述所有可能的組合需要 4x2=8 個子類。

當以乙個子類有多個直接父類時,該子類會繼承得到所有父類的方法,但是如果其中有多個父類包含同名方法會發生什麼?此時排在前面的父類中的方法會「遮蔽」後面父類中的方法。

+-person

+-student

+- teacher

是一類繼承樹;

+-skillmixin

+-basketballmixin

+- footballmixin

是一類繼承樹。

通過多重繼承,請定義「會打籃球的學生」和「會踢足球的老師」。

class

person(object):

pass

class

student(person):

pass

class

teacher(person):

pass

class

skillmixin(object):

pass

class

basketballmixin(skillmixin):

defskill(self):

return

'basketball

'class

footballmixin(skillmixin):

defskill(self):

return

'football

'class

bstudent(student,basketballmixin):

pass

class

fteacher(teacher,footballmixin):

pass

s =bstudent()

print

(s.skill())

t =fteacher()

print (t.skill())

basketball

football

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

python多重繼承

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