为什么在此 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
:
- 列出所有基 classes,遵循 classic 查找规则,如果 class 被重复访问,则多次包含它。在上面的例子中,访问过的列表 classes 是 [D, B, A, C, A].
- 扫描列表以查找重复的 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 订单上排在第一位。
有人可以解释为什么这段代码打印 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
:
- 列出所有基 classes,遵循 classic 查找规则,如果 class 被重复访问,则多次包含它。在上面的例子中,访问过的列表 classes 是 [D, B, A, C, A].
- 扫描列表以查找重复的 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 订单上排在第一位。