Python的方法解析顺序(MRO)变化过程

本文详细介绍了Python中方法解析顺序(MRO)的概念,以及在多继承情况下不同MRO算法的区别。从经典类的深度遍历到Python2.2新式类的预计算,再到Python2.3引入的C3算法,分析了各种算法的优缺点。C3算法解决了单调性和局部优先级问题,确保了类的继承关系一致性。通过实例展示了C3算法如何避免二义性,保证了MRO的正确性。
摘要由CSDN通过智能技术生成

MRO,即 Method Resolution Order,是继承中确定调用哪个方法(属性)的搜索顺序方法。
对于只支持单继承的语言(Java和C#)来说,MRO 一般比较简单;而对于 C++, Python 这种支持多继承的语言来说,MRO 就复杂很多。

先看个菱形继承的例子
菱形继承

x = D()
x.show() 调用的是A.show(),还是C.show()呢?不同的搜索顺序,决定了调用关系。

MRO 是把类的继承关系线性化的一个过程,而线性化方式决定了程序运行过程中具体会调用哪个方法。既然如此,那什么样的 MRO 才是最合理的?Python 中又是如何实现的呢?

Python 至少有三种不同的 MRO:

  1. 经典类(classic class)的深度遍历。
  2. Python 2.2 的新式类(new-style class)预计算。
  3. Python 2.3 的新式类的 C3 算法。它也是 Python 3 唯一支持的方式。

经典类和新式类:
Python 有两种类:经典类(classic class)和新式类(new-style class)。
两者的不同之处在于新式类继承自 object
在 Python 2.1 以前,经典类是唯一可用的形式;
Python 2.2 引入了新式类,使得类和内置类型更加统一;
在 Python 3 中,新式类是唯一支持的类。

1. 经典类(classic class)的深度遍历

MRO:从左至右的深度优先遍历,重复则保留第一个
获取MRO方式:inspect.getmro(objectn_ame)
在这里插入图片描述

>>> import inspect
>>> class A:
...     def show(self):
...         print "A.show()"
...
>>> class B(A): pass
>>> class C(A):
...     def show(self):
...         print "C.show()"
...
>>> class D(B, C): pass
>>> inspect.getmro(D)
(<class __main__.D at 0x105f0a6d0>, <class __main__.B at 0x105f0a600>, <class __main__.A at 0x105f0a668>, <class __
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值