当前位置: 首页 > 面试题库 >

Python-新型类中的方法解析顺序(MRO)?

郑向阳
2023-03-14
问题内容

在《Nutshell的Python》(第2版)一书中,有一个使用
旧样式类的示例演示了如何以经典解析顺序解析方法,以及该方法
与新解析顺序有何不同。

我通过用新样式重写示例来尝试相同的示例,但是结果与旧样式类所获得的结果没有什么不同。我用于运行示例的python版本是2.5.2。下面是示例:

class Base1(object):  
    def amethod(self): print "Base1"  

class Base2(Base1):  
    pass

class Base3(object):  
    def amethod(self): print "Base3"

class Derived(Base2,Base3):  
    pass

instance = Derived()  
instance.amethod()  
print Derived.__mro__  

该调用可以instance.amethod()打印Base1,但是根据我对MRO的理解,带有新的类样式,输出应该是Base3。呼叫Derived.__mro__打印:

(<class '__main__.Derived'>, <class '__main__.Base2'>, <class '__main__.Base1'>, <class '__main__.Base3'>, <type 'object'>)

我不确定我对新样式类的MRO的理解是否正确,或者我在做一个愚蠢的错误,无法检测到。请帮助我更好地了解MRO。


问题答案:

当在“天真”的深度优先方法中,同一祖先类出现多次时,旧类与新类的解析顺序之间的关键区别就出现了:例如,考虑“钻石继承”情况:

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

在这里,是传统样式,解析顺序为D-B-A-C-A:因此,在查找Dx时,A是解析顺序中解决它的第一个基数,从而将定义隐藏在C中。

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

在这里,新式的顺序是:

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

与A被迫来到分辨率顺序只有一次,毕竟它的子类,从而使覆盖(即尺寸材料的的覆盖x)实际上有效地工作。

这是应避免使用旧式类的原因之一:“菱形”模式的多重继承对它们不起作用,而对新式则可行。



 类似资料:
  • 本文向大家介绍python方法解析顺序?相关面试题,主要包含被问及python方法解析顺序?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: Python的方法解析顺序优先级从高到低为:实例本身类继承类(继承关系越近,越先定义,优先级越高)

  • 问题内容: 在Java的同一类上给定两个方法: 哪里 如果我打电话给: 我发现它被调用。 我曾期望调用最接近的匹配协定而不是最抽象的过载(这就是我所发现的) 有人可以解释为什么吗? 问题答案: 使用了最具体的适用重载-但该重载是在 编译 时根据变量的编译时类型确定的。 换一种说法: 但: 请注意,这与 重载 不同,在 重载 中,重要的是目标对象的 执行时间 类型。

  • 本文向大家介绍Python多重继承的方法解析执行顺序实例分析,包括了Python多重继承的方法解析执行顺序实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python多重继承的方法解析执行顺序。分享给大家供大家参考,具体如下: 任何实现多重继承的语言都要处理潜在的命名冲突, 这种冲突由不相关的祖先类实现同名方法引起 这里B和C都实现了eat方法, 在 D 的实例上调用 d.eat(

  • 问题内容: 这是我计划用于游戏的代码,但是它抱怨MRO错误: 问题答案: 您是从 和 继承。因为 已经 从Python继承了,所以现在无法确定首先查找方法的类;要么,或者,这将覆盖定义的东西。 您无需在此处命名所有基类;只是从该类继承: 已经包含,则无需再次添加。

  • 问题内容: 我有一个非常简单的示例: 我有3个名为的函数,并按字母顺序在Python源文件中定义。每个函数定义的主体都是对其他函数之一的调用。您可以通过我的评论看到,我必须在它们的定义下方(在文本文件中)对这些函数中的第一个进行初始调用,但是您不一定需要在另一个调用它的函数之上定义一个函数。 当然,在所有函数定义(在Python和许多其他语言中)下都具有第一个可执行代码似乎是一种常见的做法,现在我

  • 问题内容: 我尝试寻找其他答案,但仍不确定正确的方法。我有许多个非常大的.csv文件(每个文件可以是一个千兆字节),我想首先获取它们的列标签,因为它们并不完全相同,然后根据用户的喜好使用某些条件提取其中的一些列。在开始提取部分之前,我做了一个简单的测试,以了解解析此文件的最快方法,这是我的代码: 我的结果是: 因此,似乎大多数人使用的csv库确实比其他人慢很多。也许以后证明当我开始从csv文件中提