`
ooaer
  • 浏览: 138680 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

(转)Method Resolution Order (MRO) in new style Python classes

 
阅读更多

Stack Overflow link: http://stackoverflow.com/questions/1848474/method-resolution-order-mro-in-new-style-python-classes

The crucial difference between resolution order for legacy vs new-style classes comes when the same ancestor class occurs more than once in the "naive", depth-first approach -- e.g., consider a "diamond inheritance" case:

>>> class A: x = 'a'
... 
>>> class B(A): pass
... 
>>> class C(A): x = 'c'
... 
>>> class D(B, C): pass
... 
>>> D.x
'a'


here, legacy-style, the resolution order is D - B - A - C - A : so when looking up D.x, A is the first base in resolution order to solve it, thereby hiding the definition in C. While:

>>> class A(object): x = 'a'
... 
>>> class B(A): pass
... 
>>> class C(A): x = 'c'
... 
>>> class D(B, C): pass
... 
>>> D.x
'c'
>>>



here, new-style, the order is:

>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)



with A forced to come in resolution order only once and after all of its subclasses, so that overrides (i.e., C's override of member x) actually work sensibly.

It's one of the reasons that old-style classes should be avoided: multiple inheritance with "diamond-like" patterns just doesn't work sensibly with them, while it does with new-style.

 

分享到:
评论

相关推荐

    Python 多继承类的 MRO 算法——C3算法

    这就是所谓的“方法解析顺序”(Method Resolution Order,MRO)。在Python 2.3之前,这个问题是通过简单深度优先搜索(DFS)策略解决的,但这种方法并不总是给出理想的解决方案。因此,Python引入了C3线性化算法,...

    Python库 | python-mro-language-server-0.0.1.tar.gz

    “MRO”在Python中代表方法解析顺序(Method Resolution Order),这是Python多继承处理的一个关键概念。Python使用MRO来决定在调用类的方法时,应该使用哪个父类的方法。语言服务器通常会提供诸如代码补全、错误...

    圣诞树代码编程python-24-拓展-mro顺序.ev4.rar

    标题中的“圣诞树代码编程python-24-拓展-mro顺序”揭示了这是一个关于Python编程的教程,特别涉及到了Python的多继承(Multiple Inheritance)和方法解析顺序(Method Resolution Order,简称MRO)。在Python中,...

    Python库 | mro_tools-0.2.0-py2.py3-none-any.whl

    `mro_tools`库的具体功能可能涉及Python的多继承机制,即方法解析顺序(Method Resolution Order,MRO)。在Python的面向对象编程中,当一个类继承自多个父类时,如果一个方法在多个父类中都存在,Python会根据MRO来...

    Python基础教程:新式类与经典类.docx

    新式类的主要好处在于它们支持多重继承,并且能够更好地处理方法解析顺序(Method Resolution Order, MRO)。 - **多继承**:新式类在处理多继承时,采用广度优先搜索策略来查找方法。这意味着在寻找一个方法时,会...

    python:MRO的计算方式

    我们都已经知道,Python 3(Python 2 的新式类)中多继承模式是使用 C3 算法来确定 MRO(Method Resolution Order) 的。 下面就讲解C3算法具体是怎么计算的。 MRO计算规则 首先来定义一些符号: 用CN表示一个类:C1, C2...

    Python 类与元类的深度挖掘 I【经验】

    **MRO(Method Resolution Order)** 是Python中用于确定方法调用顺序的一种算法。它是通过C3线性化算法计算出来的,确保了即使在复杂的继承关系中也能正确地找到方法。 **示例代码:** ```python class X: pass ...

    浅谈Python的方法解析顺序(MRO)

    Python的方法解析顺序(Method Resolution Order,MRO)是面向对象编程中一个关键的概念,尤其是在处理多继承时。MRO决定了当一个实例调用一个方法时,Python如何确定应该使用哪个父类的方法。MRO遵循一定的规则,...

    Python多继承以及MRO顺序的使用

    这时就需要了解MRO(Method Resolution Order,方法解析顺序)。 MRO是Python解决多继承方法调用冲突的一种策略,它遵循C3线性化规则,保证了方法调用的一致性和可预测性。在Python 2.3版本引入了`__mro__`属性,它...

    python课程设计-26-子类调用父类同名方法和属性之代码实现.ev4.rar

    3. 使用`__mro__`:Python的每个类都有一个`__mro__`(Method Resolution Order)属性,它是一个元组,包含了类的继承链。通过`__mro__`,我们可以找到同名方法的来源。但这通常用于更复杂的多继承场景,一般不直接...

    Python语言基础:类的继承.pptx

    当子类中存在与父类同名的方法时,Python 使用方法解析顺序(Method Resolution Order,MRO)来决定调用哪个父类的方法。默认情况下,Python 使用 C3 算法来确定 MRO,它保证了调用顺序的线性一致性。 总的来说,类...

    Python多重继承使用方法共2页.pdf.zip

    需要注意的是,当子类调用父类的同名方法时,Python会遵循MRO(Method Resolution Order,方法解析顺序)来决定调用哪个父类的方法。Python的MRO遵循C3线性化规则,保证了继承链的确定性和一致性。 Python的MRO可以...

    第十二天 04单继承:子类只继承一个父类【千锋Python人工智能学院】1

    然而,当多个父类中有同名的方法时,就会出现方法解析顺序(Method Resolution Order,MRO)的问题。Python使用C3线性化算法来确定多继承类中方法的调用顺序。我们可以使用`__mro__`属性来查看这个顺序。例如: ```...

    python-read-and-writepython见闻志

    Method Resolution Order(MRO)是指在多重继承情况下,Python如何决定应该调用哪个类的方法。Python使用C3线性化算法来处理继承顺序问题,以确保每个类的方法都能被正确调用。 super()函数在Python中用于调用父类...

    Python 源码剖析学习笔记.zip

    通过源码剖析,我们可以探索类的创建过程、方法解析顺序(Method Resolution Order, MRO)、多重继承的工作原理等,这些对于理解和使用元类(metaclass)等高级特性至关重要。 最后,Python的模块和导入系统是其可...

    python面向对象练习题.pdf

    - **新式类**:遵循广度优先原则,即按照MRO(Method Resolution Order,方法解析顺序)来进行查找。 **3. 特性** - 在Python 3中,不再区分经典类和新式类,所有的类都被认为是新式类,并且默认继承自`object`类。...

    python中多重继承共6页.pdf.zip

    Python使用一种叫做C3线性化(C3 Linearization)的方法来确定调用哪个父类的方法,这通常被称为方法解析顺序(Method Resolution Order, MRO)。默认情况下,可以通过`__mro__`属性查看一个类的方法解析顺序。例如...

    学学Python_40类_06 多继承

    在Python中,如果多个父类中有相同的方法或属性,Python会使用MRO(Method Resolution Order,方法解析顺序)来决定调用哪个父类的方法。默认的MRO遵循C3线性化规则,即先找当前类,然后按照父类的继承顺序从左到右...

    Python 的描述符 descriptor详解

    Python 在 2.2 版本中引入了descriptor(描述符)功能,也正是基于这个功能实现了新式类(new-styel class)的对象模型,同时解决了之前版本中经典类 (classic class) 系统中出现的多重继承中的 MRO(Method Resolution...

    Python 107.mro().mp4

    Python 107.mro().mp4

Global site tag (gtag.js) - Google Analytics