首页 > 技术文章 > 继承顺序之mro线性顺序列表

xuewei95 2021-04-19 18:15 原文

class A:
   # def test(self):
   #  print('A')
   pass

class B(A):
   # def test(self):
   #  print('B')
   pass

class C(A):
   # def test(self):
   #  print('c')
   pass

class D(B):
   # def test(self):
   #  print('D')
   pass

class E(C):
   # def test(self):
   #  print('E')
   pass

class F(D,E):
   def test(self):
      print('F')
   # pass

f1 = F()
f1.test()
print(F.__mro__) # (<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
# python3都是新式类,所以依次执行顺序是FDBECA,可以看到最后有个object,其实这个是A类的基类,自动继承了object
# python2中,当基类为经典类时,那么父类与子类都是经典类;当基类为新式类时,那么父类与子类都是新式类;python2经典类没有__mro__方法

'''
继承顺序:
python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是深度优先和广度优先;
当类是经典类时,多继承情况下,会按照深度优先方式查找(从左至右,左边查到顶级,然后从右边开始查找),F-->D-->B-->A-->E-->C
当类是新式类时,多继承情况下,会按照广度优先方式查找(从左至右,左边不查到顶级---顶级的下一级,然后从右边开始查找且查找到顶级),F-->D-->B-->E-->C-->A
'''

'''
python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表;
为了实现继承,python会在MRO列表上从左至右开始查找基类,直到找到第一个匹配这个属性的类为止。
而这个MRO列表的构造是通过一个C3线性化算法实现的,我们不去深究这个算法的数学理论,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:
1、子类会先于父类被检查
2、多个父类会根据他们在元组中的顺序被检查
3、如果对下一个类存在两个合法的选择,选择第一个父类
'''

 

推荐阅读