单继承与多继承?
单继承:一个类只能继承一个父类的方式。
多继承:一个类可以继承多个父类的方式。
单继承:(生物角度)
人类->哺乳类动物->动物->生物->有机物…
多继承:(社会角度)
舞蹈老师(教舞蹈) 体育老师(运动) 爸爸(帅气) 妈妈(打扫卫生)
我(舞蹈,运动,帅气,打扫卫生)
单继承案例:
父类:
pass
子类(父类):
pass
多继承案例:
父类1:
pass
父类2:
pass
父类3:
pass
子类(父类1,父类2,父类3):
pass
多继承的问题所在:菱形继承或者钻石继承中的问题。
菱形bug:某个方法在继承中被多次调用!
菱形继承的bug解决:MRO列表和super 类
解决办法:将菱形继承改变成类似于单继承的方式
当我们定义一个菱形继承关系的时候,程序会自动生成一个新的MRO列表。
MRO列表: Method Realtion Order 方法关系列表。
MRO列表的生成的原则:1.子类永远在父类的前面 2.同一等级的类,按照子类中的继承顺序摆放
super()调用的时候,不是查找父类, 实际上super是查找MRO列表的上一个类
super()调用对象方法的时候不需要传入对象,自动传入
issubclass(子类,父类) :检测一个类是否是另一个类的子类
如果需要查看mro列表,可以使用类名.mro() 方法 或用类名.__mro__ 查看
# 继承又分为 单继承 和多继承两种
# 单继承:一个类只能继承一个类
# 多继承:一个类可以继承多个类
# 血缘关系(单继承)
class
GrandFather
(
)
:
money
=
10000000
class
Father
(
GrandFather
)
:
money
=
1000
face
=
"帅气的一张脸"
class
Me
(
Father
)
:
pass
# 实例化
myself
=
Me
(
)
print
(
myself
.
money
)
print
(
myself
.
face
)
# 多继承(社会角度)
class
Python
(
)
:
def
luoji
(
self
)
:
print
(
"语法阶段培养逻辑思路"
)
class
Spider
(
)
:
def
paqu
(
self
)
:
print
(
"爬虫阶段学会了抓自己感兴趣的小姐姐图片"
)
class
Think
(
)
:
def
fenxi
(
self
)
:
print
(
"数据分析阶段我学会了数据分析科学的方法"
)
class
MySelf
(
Think
,
Spider
,
Python
)
:
pass
me
=
MySelf
(
)
me
.
luoji
(
)
me
.
paqu
(
)
me
.
fenxi
(
)
# 多继承带来的BUG-菱形继承
class
Human
(
)
:
def
say
(
self
)
:
print
(
"人类向天怒吼:人定胜天!"
)
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
(
"小孩向天怒吼:哇哇哇~"
)
# 实例化
child
=
Child
(
)
# child.say()
# mro列表
print
(
Child
.
mro
(
)
)
# super() 实际是调用 mro列表的上一级关系