RUN IT 多繼承以及MRO順序

2021-09-19 10:39:45 字數 2840 閱讀 2202

多繼承指的是子類繼承多個父類,可以通過三種方式訪問父類的方法:

父類名.父類方法(self):這種方式容易造成父類方法被呼叫多次的問題,而且父類名稱發生變化,子類呼叫的地方都需要修改。

super(指定某個類名,self).父類方法():從指定類名的mro下一級開始呼叫

super().父類方法(): 按照mro上級父類的方法。

mro 是method resolution order 的縮寫,及方法解析順序,可以通過類名. __ mro __ 屬性查詢出來,當前類的呼叫順序,其順序由c3演算法來決定,保證每乙個類只呼叫一次。是python中處理二義性問題的演算法。

super()單繼承只需要傳父類引數,但是多繼承必須傳全部引數,可以使用多值引數。

print

("******多繼承使用super().__init__ 發生的狀態******"

)class

parent

(object):

def__init__

(self, name,

*args,

**kwargs)

:# 為避免多繼承報錯,使用不定長引數,接受引數

print

('parent的init開始被呼叫'

) self.name = name

print

('parent的init結束被呼叫'

)class

son1

(parent)

:def

__init__

(self, name, age,

*args,

**kwargs)

:# 為避免多繼承報錯,使用不定長引數,接受引數

print

('son1的init開始被呼叫'

) self.age = age

super()

.__init__(name,

*args,

**kwargs)

# 為避免多繼承報錯,使用不定長引數,接受引數

print

('son1的init結束被呼叫'

)class

son2

(parent)

:def

__init__

(self, name, gender,

*args,

**kwargs)

:# 為避免多繼承報錯,使用不定長引數,接受引數

print

('son2的init開始被呼叫'

) self.gender = gender

super()

.__init__(name,

*args,

**kwargs)

# 為避免多繼承報錯,使用不定長引數,接受引數

print

('son2的init結束被呼叫'

)class

grandson

(son1, son2)

:def

__init__

(self, name, age, gender)

:print

('grandson的init開始被呼叫'

)# 多繼承時,相對於使用類名.__init__方法,要把每個父類全部寫一遍

# 而super只用一句話,執行了全部父類的方法,這也是為何多繼承需要全部傳參的乙個原因

# super(grandson, self).__init__(name, age, gender)

super()

.__init__(name, age, gender)

print

('grandson的init結束被呼叫'

)print

(grandson.__mro__)

gs = grandson(

'grandson',12

,'男'

)print

('姓名:'

, gs.name)

print

('年齡:'

, gs.age)

print

('性別:'

, gs.gender)

print

("******多繼承使用super().__init__ 發生的狀態******\n\n"

)執行結果:

****

**多繼承使用super()

.__init__ 發生的狀態**

****

(<

class

'__main__.grandson'

>

,<

class

'__main__.son1'

>

,<

class

'__main__.son2'

>

,<

class

'__main__.parent'

>

,<

class

'object'

>

)grandson的init開始被呼叫

son1的init開始被呼叫

son2的init開始被呼叫

parent的init開始被呼叫

parent的init結束被呼叫

son2的init結束被呼叫

son1的init結束被呼叫

grandson的init結束被呼叫

姓名: grandson

年齡: 12

性別: 男

****

**多繼承使用super()

.__init__ 發生的狀態**

****

多繼承以及MRO順序

單獨呼叫父類的方法 print 多繼承使用類名.init發生的狀態 class parent object definit self,name print parent的init開始被呼叫 self.name name print parent的init結束被呼叫 class son1 parent...

多繼承以及MRO順序

個類同時繼承多個類,稱為多繼承。class 類名 類名1,類名2 多繼承關係中,當多個 類具有同名的成員,類調時該成員時先調 繼承關係中的第 個宣告的類的成員。多繼承指的是子類繼承多個父類,可以通過三種方式訪問父類的方法 1 父類名.父類方法 self 這種方式容易造成父類方法被呼叫多次的問題 菱形...

多繼承及MRO順序

super init 相對於類名.init,在單繼承上用法基本 差 但在多繼承上有區別,super方法能保證每個父類的方法只會執行一次,而使用類名的方法會導致方法被執行多次 多繼承時,使用super方法,對父類的傳引數,應該是由於python中 super的演算法導致的原因,必須把引數全部傳遞,否則...