什么是MRO
Method Resolution Order , 定义了Python中多继承存在的情况下,解释器查找函数解析的具体顺序
什么是函数解析顺序# 经典继承问题 - 棱形继承
class A:
def who_am_i(self):
print("i am A")
class B:
pass
class C:
def who_am_i(self):
print("i am A")
class D(B, C):
pass
d = D()
d.who_am_i()
# 结果为
i am A
None
经典类(Old-style Class) VS 新式类(New-style- Class)
# MRO算法不一样
# DFS 深度优先算法 BFS 广度优先算法
python 2.1 经典类 ,DFS算法
python 2.2 引入新式类,DFS和BFS算法
python 2.3 经典类与新式类共存,DFS和C3算法
python 3+ 新式类,C3算法
深度优先(DFS)
按照从左往右的顺序深度优先遍历类的继承关系,从而缺点类种函数的调用顺序
1 - 检查当前类中是否有此函数,如果有则直接调用
2 - 检查当前类中第一个父类是否有该函数,如果没有则检查父类的第一个父类是否有该函数,以此递归深度遍历
3 - 如果没有则回溯一层,检查下一个父类里面是否有该函数,并按照2中的方式递归
4 - 已查找过的类不会再查
广度优先(BFS)
按照从左往右的顺序深度优先遍历类的继承关系,从而缺点类种函数的调用顺序
1 - 检查当前类中是否有此函数,如果有则直接调用
2 - 检查当前类中第一个父类是否有该函数,检查当前类中第二个父类是否有该函数
3 - 如果没有则回溯一层,检查第一个父类的父类里面是否有该函数,并按照2中的方式递归
模式对比与劣势深度优先(DFS)
正常模式继承关系: A - B - D - C - E
菱形模式继承关系 : A - B - D - C
DFS缺陷:
棱形继承关系下:先查找A,再查找C,但是C是D 的子类,C类中可以重写D类方法,但永远访问不到。
广度优先(BFS)
正常模式继承关系: A - B - C - D - E
菱形模式继承关系 : A - B - C - D
BFS缺陷:
正常模式继承关系下:D类与C类实现同一方法,D类方法被B继承,但B类无此方法,按照BFS算法,去C类查找,找到并返回,但是期待的B(D) 来实现不同。违背了类的单调性
新式类C3算法
新算法与深度遍历算法类试,但是新算法会对深度优先遍历得到的路径进行额外检查。