python多繼承及其super的用法

2021-10-07 12:28:08 字數 2452 閱讀 5511

python也具有多繼承的功能,而同樣的,大家能想到多繼承必須要引入一些特定的方法來準確呼叫子類或基類的過載、重寫的方法,否則會出現混亂。

本文參考multiple inheritance in python對該問題進行簡要論述。

如下圖描述了乙個簡單的類繼承關係

下面是上面類圖的**,class1、class2、class3都分別包含乙個m方法,

class

class1

:def

m(self)

:print

("in class1"

)class

class2

(class1)

:def

m(self)

:print

("in class2"

)class

class3

(class1)

:def

m(self)

:print

("in class3"

)class

class4

(class2, class3)

:def

__init__

(self)

:super

(class4, self)

.m()

super

(class2, self)

.m()

super

(class3, self)

.m()

obj = class4(

)

上面**的輸出結果為:

in class2

in class3

in class1

看出區別了嗎,區別就在於super中的第乙個引數。python的多繼承通常來說是按順序繼承的,但也不盡然

它的多繼承順序是依據乙個叫做**method resolution order (mro)**的演算法來決定的,通過使用類名.mro()可以得到繼承關係的順序。

參考python multiple inheritance中的乙個例子

如下圖所示是乙個比較複雜的繼承關係圖

其**編寫如下

# demonstration of mro

classx:

pass

classy:

pass

classz:

pass

class

a(x, y)

:pass

class

b(y, z)

:pass

class

m(b, a, z)

:pass

print

(m.mro(

))

而其輸出結果為:

[

>

,>

,>

,>

,>

,>

,>

]

在實際情況中,不可避免地會遇見這種比較複雜的繼承關係,而要弄清楚它們的繼承順序似乎很是麻煩也容易出錯,那麼有沒有辦法直接指定呼叫某個基類的方法呢?

這當然是可以的。

class

class1

:def

m(self)

:print

("in class1"

)class

class2

(class1)

:def

m(self)

:print

("in class2"

)class

class3

(class1)

:def

m(self)

:print

("in class3"

)class

class4

(class2, class3)

:def

__init__

(self)

: class1.m(self)

class2.m(self)

class3.m(self)

obj = class4(

)

輸出結果為:

in class1

in class2

in class3

即,只需指定繼承的類名,傳入子類物件,即可呼叫任意指定基類的方法啦!

python多繼承及其super的用法

python也具有多繼承的功能,而同樣的,大家能想到多繼承必須要引入一些特定的方法來準確呼叫子類或基類的過載 重寫的方法,否則會出現混亂。本文參考multiple inheritance in python對該問題進行簡要論述。如下圖描述了乙個簡單的類繼承關係 下面是上面類圖的 class1 cla...

python入門 繼承 多繼承

定義 子類擁有父類的所有方法和屬性,子類可直接享受父類中封裝好的方法 語法 class 類名 父類名 pass繼承的傳遞性 c類繼承與b類,b類繼承於a類 覆蓋父類的方法 在子類中定義乙個和父類同名的方法並實現 super 函式 在重寫父類方法時,呼叫在父類中封裝的方法實現 例 def login ...

python 單繼承,多繼承

父類 class person def init self,name,age self.name name self.self.age age def introduce self print 父類方法person self.name 學生類 繼承 person class student pers...