首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 2.7 MRO的行为异常

Python 2.7 MRO的行为异常
EN

Stack Overflow用户
提问于 2015-10-21 17:08:11
回答 1查看 266关注 0票数 0

所以我对Python2.7的奇妙世界做了一些研究,多重继承和MRO,我在阅读的时候尝试了不同的例子,我遇到了一些真正难倒我的东西。

这样你就有了一个经典的钻石MI示例:

代码语言:javascript
复制
class A:
    def __init__(self):
        print "A"

class B(A):
    pass

class C(A):
    def __init__(self):
        print "C"

class D(B, C):
    pass

instance = D()

在我读过的所有MRO资源中,这个例子应该有一个DBCA的MRO,所以初始化D应该打印"C“,而不是打印"A”。奇怪的是,当我将A、B、C或D的定义更改为int之类的子类时,它给出了打印"C“的预期行为。

为什么类结构的MRO会根据基类是否是原语类型而表现出不同的行为?这是一个bug吗?

EN

回答 1

Stack Overflow用户

发布于 2015-10-21 17:08:11

当我输入这段代码时,我对MRO进行了read a bit more,并发现(据我粗略了解) python有旧式(2.2之前)的类和新式的类。老式的MRO是从左到右的深度优先(这将提供DBAC),而新型的是一种称为C3的算法,我假设所有Python2.7类都使用该算法。将C3算法应用于具有这种继承层次结构的新样式类,从而得到DBCA。基本上在2.7中,继承自Object的类是新风格的,而不继承的类是旧风格的。我把2.7和3.0搞混了,在3.0中,所有的类都继承自Object。因此,如果D的任何基类继承自新样式的类,它们将为D提供新样式的MRO,否则本例中的D将具有旧样式的MRO。

这是一个很酷的小怪癖,我认为更多的人应该意识到。希望这是有意义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33255186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档