python中多重繼承

2021-09-23 22:25:20 字數 2302 閱讀 1511

除了從乙個父類繼承外,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同時繼承自bc,也就是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圖,每次輸出乙個入度為零的點 相當於沒有人...