Python2.7MRO行为异常

2024-09-26 22:10:29 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我一直在研究python2.7多重继承和mro的奇妙世界,我在阅读时尝试了不同的例子,我遇到了一些让我困惑的东西。在

你的经典钻石:

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行为会因基类是否为基元类型而有所不同?这是虫子吗?在


Tags: instanceselfinitdef世界pass资源class
1条回答
网友
1楼 · 发布于 2024-09-26 22:10:29

在我输入关于MRO的这篇文章时,我发现(据我粗略了解)python有旧的(2.2之前的)类和新样式的类。旧样式的MRO是从左到右的深度优先(这将提供DBAC),而新样式是一个称为C3的算法,我假设所有python2.7类都使用这个算法。将C3算法应用于具有此继承层次结构的新样式类可以得到DBCA。基本上在2.7中,继承自Object的类是新样式,而不是旧样式的类。我把2.7和3.0搞混了,3.0中所有的类都是从Object继承的。因此,如果D的任何一个基继承自一个新样式的类,它们将给D一个新样式的MRO,否则本例中的{}将具有一个旧样式的MRO。在

这是一个很酷的小怪癖,我想更多的人应该意识到。希望这是有道理的。在

相关问题 更多 >

    热门问题