为什么在此 MRO 中打印 "Y" 而不是 "X"?

Why is "Y" printed instead of "X" in this MRO?

有人可以解释为什么这段代码打印 Y 而不是 X 吗?我希望它打印“X”,因为它说传入 Class C 并且 Class X 是下一个超级 class.

class X:
def foo(self):
    return "X"

class Y:
    def foo(self):
        return "Y"

class A(X):
    def foo(self):
        return self.met()

class B(A):
    def foo(self):
        return "B"

class C(X):
    pass

class D(C, X):
    def met(self):
        return "D"

class E(A, D):
    def foo(self):
        return super().foo()

class F(Y,B):
    pass

class G(D, B):
    pass

class H(E, A, X):
     def met(self):
        return "H"

class I(G,F):
    pass
print(I().foo())

抱歉,代码太长了,但我不知道如何在不使问题不清楚的情况下缩短它

每 Python Multiple Inheritance: The Diamond Rule:

  1. 列出所有基 classes,遵循 classic 查找规则,如果 class 被重复访问,则多次包含它。在上面的例子中,访问过的列表 classes 是 [D, B, A, C, A].
  2. 扫描列表以查找重复的 classes。如果找到任何一个,则删除除一个以外的所有匹配项,将最后一个保留在列表中。在上面的示例中,列表在删除重复项后变为 [D, B, C, A]。
m = ['I', 'G', 'D', 'C', 'X', 'object', 'X', 'object', 'B', 'A', 
     'X', 'object', 'F', 'Y', 'object', 'B', 'A', 'X', 'object']
s = set()
custom_mro = [i for i in reversed(m) if not (i in s or s.add(i))][::-1]
original_mro = list(i.__name__ for i in I.__mro__)

assert custom_mro == original_mro
print(custom_mro) #['I', 'G', 'D', 'C', 'F', 'Y', 'B', 'A', 'X', 'object']

Y 被打印出来,因为 Y class 在 mro 订单上排在第一位。