当我读到 Python 的 C3 方法解析顺序时,我经常听到它被简化为“孩子在父母之前,尊重子类的顺序”。然而,这似乎只有在所有子类都继承自同一个祖先时才成立。
例如
class X():
def FOO(self):
return 11
class A(X):
def doIt(self):
return super().FOO()
def FOO(self):
return 42
class B(X):
def doIt(self):
return super().FOO()
def FOO(self):
return 52
class KID(A,B):
pass
这里KID的MRO是:KID, A, B, X
但是,如果我将 B 改为:
class B(object):
KID 的 MRO 变为:KID、A、X、B
似乎我们在搜索完所有 KID 的父母之前正在搜索 A 的超类。
因此,现在它似乎比“儿童优先,广度优先”到“儿童优先,如果有共同祖先,则广度优先”更不直观,否则深度优先。
如果一个类停止使用一个共同的祖先,那么 MRO 会发生变化(即使除了那个链接之外整个层次结构是相同的),并且您开始调用更深层次的祖先方法而不是该类中的方法,这将是一个很大的问题。