單繼承與多繼承?
單繼承:一個(gè)類(lèi)只能繼承一個(gè)父類(lèi)的方式。
多繼承:一個(gè)類(lèi)可以繼承多個(gè)父類(lèi)的方式。
單繼承:(生物角度)
人類(lèi)->哺乳類(lèi)動(dòng)物->動(dòng)物->生物->有機(jī)物…
多繼承:(社會(huì)角度)
舞蹈老師(教舞蹈) 體育老師(運(yùn)動(dòng)) 爸爸(帥氣) 媽媽(打掃衛(wèi)生)
我(舞蹈,運(yùn)動(dòng),帥氣,打掃衛(wèi)生)
單繼承案例:
父類(lèi):
pass
子類(lèi)(父類(lèi)):
pass
多繼承案例:
父類(lèi)1:
pass
父類(lèi)2:
pass
父類(lèi)3:
pass
子類(lèi)(父類(lèi)1,父類(lèi)2,父類(lèi)3):
pass
多繼承的問(wèn)題所在:菱形繼承或者鉆石繼承中的問(wèn)題。
菱形bug:某個(gè)方法在繼承中被多次調(diào)用!
菱形繼承的bug解決:MRO列表和super 類(lèi)
解決辦法:將菱形繼承改變成類(lèi)似于單繼承的方式
當(dāng)我們定義一個(gè)菱形繼承關(guān)系的時(shí)候,程序會(huì)自動(dòng)生成一個(gè)新的MRO列表。
MRO列表: Method Realtion Order 方法關(guān)系列表。
MRO列表的生成的原則:1.子類(lèi)永遠(yuǎn)在父類(lèi)的前面 2.同一等級(jí)的類(lèi),按照子類(lèi)中的繼承順序擺放
super()調(diào)用的時(shí)候,不是查找父類(lèi), 實(shí)際上super是查找MRO列表的上一個(gè)類(lèi)
super()調(diào)用對(duì)象方法的時(shí)候不需要傳入對(duì)象,自動(dòng)傳入
issubclass(子類(lèi),父類(lèi)) :檢測(cè)一個(gè)類(lèi)是否是另一個(gè)類(lèi)的子類(lèi)
如果需要查看mro列表,可以使用類(lèi)名.mro() 方法 或用類(lèi)名.__mro__ 查看
# 繼承又分為 單繼承 和多繼承兩種
# 單繼承:一個(gè)類(lèi)只能繼承一個(gè)類(lèi)
# 多繼承:一個(gè)類(lèi)可以繼承多個(gè)類(lèi)
# 血緣關(guān)系(單繼承)
class
GrandFather
(
)
:
money
=
10000000
class
Father
(
GrandFather
)
:
money
=
1000
face
=
"帥氣的一張臉"
class
Me
(
Father
)
:
pass
# 實(shí)例化
myself
=
Me
(
)
print
(
myself
.
money
)
print
(
myself
.
face
)
# 多繼承(社會(huì)角度)
class
Python
(
)
:
def
luoji
(
self
)
:
print
(
"語(yǔ)法階段培養(yǎng)邏輯思路"
)
class
Spider
(
)
:
def
paqu
(
self
)
:
print
(
"爬蟲(chóng)階段學(xué)會(huì)了抓自己感興趣的小姐姐圖片"
)
class
Think
(
)
:
def
fenxi
(
self
)
:
print
(
"數(shù)據(jù)分析階段我學(xué)會(huì)了數(shù)據(jù)分析科學(xué)的方法"
)
class
MySelf
(
Think
,
Spider
,
Python
)
:
pass
me
=
MySelf
(
)
me
.
luoji
(
)
me
.
paqu
(
)
me
.
fenxi
(
)
# 多繼承帶來(lái)的BUG-菱形繼承
class
Human
(
)
:
def
say
(
self
)
:
print
(
"人類(lèi)向天怒吼:人定勝天!"
)
class
Man
(
Human
)
:
def
say
(
self
)
:
super
(
)
.
say
(
)
print
(
"男人向天怒吼:女孩的心思我不懂~"
)
class
WoMan
(
Human
)
:
def
say
(
self
)
:
super
(
)
.
say
(
)
print
(
"女人向天怒吼:男人你們能不能別猜我心思了"
)
class
Child
(
Man
,
WoMan
)
:
def
say
(
self
)
:
super
(
)
.
say
(
)
print
(
"小孩向天怒吼:哇哇哇~"
)
# 實(shí)例化
child
=
Child
(
)
# child.say()
# mro列表
print
(
Child
.
mro
(
)
)
# super() 實(shí)際是調(diào)用 mro列表的上一級(jí)關(guān)系
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
