有人能解释一下为什么这段代码打印的是Y而不是X吗?我希望它能打印出";X〃;因为它说通过C班和X班是下一个超级班。
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())
抱歉代码太长了,但我不知道如何在不让问题变得不清楚的情况下缩短
Per PythonMultiple Inheritance: The Diamond Rule
:
- 按照经典查找规则列出所有基类,如果重复访问某个类,则多次包含该类。在上面的例子中,访问类的列表是[D,B,A,C,A]
- 扫描列表中的重复类。如果找到任何匹配项,请删除除一项外的所有匹配项,并保留列表中的最后一项。在上面的示例中,在删除重复项之后,列表变为[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
类列在mro订单的第一位。