单继承与多继承?
单继承:一个类只能继承一个父类的方式。
多继承:一个类可以继承多个父类的方式。
单继承:(生物角度)
人类->哺乳类动物->动物->生物->有机物…
多继承:(社会角度)
舞蹈老师(教舞蹈) 体育老师(运动) 爸爸(帅气) 妈妈(打扫卫生)
我(舞蹈,运动,帅气,打扫卫生)
单继承案例:
父类:
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列表的上一级关系