除了從乙個父類繼承外,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):
def skill(self):
return 'basketball'
class footballmixin(skillmixin):
def skill(self):
return 'football'
class bstudent(student, basketballmixin):
pass
class fteacher(teacher, footballmixin):
pass
s = bstudent()
print (s.skill())
t = fteacher()
print (t.skill())
**:廖雪峰 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圖,每次輸出乙個入度為零的點 相當於沒有人...