多繼承指的是子類繼承多個父類,可以通過三種方式訪問父類的方法:
父類名.父類方法(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的演算法導致的原因,必須把引數全部傳遞,否則...