【转】python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>

对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就需要对当前类和基类进行搜索以确定方法所在的位置。
而搜索的顺序就是所谓的「方法解析顺序」(Method Resolution Order,或MRO)。
对于只支持单继承的语言来说,MRO 一般比较简单;而对于 Python 这种支持多继承的语言来说,MRO 就复杂很多。

而具体讨论MRO,我们需要针对不同python版本中的MRO进行解析

经典类:DFS深度优先搜索(Python2.2以前的版本)
新式类:BFS广度优先搜索(Python2.2中提出,在与经典类共存的情况下,是否继承object是他们的区分方式)
新式类C3算法:Python2.3提出(也是现在Python3唯一支持的方式)

对于下面讨论的类的多重继承:我们讨论两种情况。

【转】python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>

一:经典类(深度优先搜索)

 在经典类中,没有__mro__属性可以去查看MRO的顺序,但是,可以使用inspect模块中getmro方法

import inspect
inspect.getmro(类名)

(一)正常继承模式

 【转】python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>

在正常继承模式下,不会引起任何问题

(二)交叉继承模式

 【转】python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>

缺点:C类原本是D的子类,若是在C中对D的某个方法进行了重载(B类没有进行重载),那么我们在A中所希望使用的是C中的重载方法,

但是由于查找顺序是A->B->D->C,所以对于在C类中的重载方法,会在结果D时被过滤(因为在D中查找到该方法就停止了),导致永远无法访问到C中的重载方法

import inspect

class D:
    def foo(self):
        print("D.foo")

class C(D):
    def foo(self):
        print("C.foo")

class B(D):
    pass

class A(B,C):
    pass

print(inspect.getmro(A))    #A->B->D->C
obj = A()
obj.foo()   #D.foo
代码演示

相关文章:

  • 2021-11-04
  • 2022-12-23
  • 2022-12-23
  • 2021-08-07
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-20
  • 2021-09-25
  • 2022-12-23
  • 2022-02-16
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案