为什么这是一个模棱两可的MRO?

Der*_*會功夫 11 python multiple-inheritance

class First(object):
    def __init__(self):
        print "first"

class Second(First):
    def __init__(self):
        print "second"

class Third(First, Second):
    def __init__(self):
        print "third"
Run Code Online (Sandbox Code Playgroud)

资源

为什么Python不能创建一致的MRO?在我看来它非常清楚:

  1. 如果第三个方法不存在,则首先搜索
  2. 如果在First中不存在方法,则在第二个中搜索

但如果你尝试一下:

TypeError: Error when calling the metaclass bases
    Cannot create a consistent method resolution
order (MRO) for bases First, Second
Run Code Online (Sandbox Code Playgroud)

Bre*_*arn 16

为了"一致",MRO应该满足这些限制:

  1. 如果一个类继承自多个超类,那么它在超类列表中先前列出的那些应该在MRO中比它稍后列出的那些更早.
  2. MRO中的每个班级都应该在它的任何超类之前.

您提议的层次结构没有任何可能的顺序满足这些约束.因为第三个被定义为从第二个之前的第一个继承,所以第一个应该在MRO之前来到第二个.但是因为Second继承自First,Second应该来自MRO的First.这种矛盾无法调和.

您可以阅读有关Python用于计算MRO的精确方法的更多信息,称为C3线性化算法.

  • [C3线性化算法](https://en.wikipedia.org/wiki/C3_linearization)是必读的. (4认同)

小智 5

Python内部认为子类之前不存在超类。

根据你的代码。扫描或加载类后,Python 认为方法解析必须是:

Third -> Second -> First
Run Code Online (Sandbox Code Playgroud)

这里,First是Second的超类。

但是在执行时,在检查Third后,它会遇到First ,它是Second的超类。

因此出现了类型错误。

class Third(First, Second): # Wrong
class Third(Second, First): # Correct
Run Code Online (Sandbox Code Playgroud)