除了從乙個父類繼承外,python允許從多個父類繼承,稱為多重繼承。
多重繼承的繼承鏈就不是一棵樹了,它像這樣:
class看下圖:a(object):
def__init__
(self, a):
'init a...
'self.a =a
class
b(a):
def__init__
(self, a):
super(b, self).
__init__
(a)
'init b...
'class
c(a):
def__init__
(self, a):
super(c, self).
__init__
(a)
'init c...
'class
d(b, c):
def__init__
(self, a):
super(d, self).
__init__
(a)
'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要建立多執行緒模式的 udpserver:mytcpserver(tcpserver, forkingmixin)
pass
class如果沒有多重繼承,要實現上述所有可能的組合需要 4x2=8 個子類。myudpserver(udpserver, threadingmixin):
pass
當以乙個子類有多個直接父類時,該子類會繼承得到所有父類的方法,但是如果其中有多個父類包含同名方法會發生什麼?此時排在前面的父類中的方法會「遮蔽」後面父類中的方法。
+-person是一類繼承樹;+-student
+- teacher
+-skillmixin是一類繼承樹。+-basketballmixin
+- footballmixin
通過多重繼承,請定義「會打籃球的學生」和「會踢足球的老師」。
classperson(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()
(s.skill())
t =fteacher()
print (t.skill())
basketballfootball
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圖,每次輸出乙個入度為零的點 相當於沒有人...