我正在阅读Python Multiple Inheritance (on Programiz),然后我发现了这个 StackOverflow 问题,Method Resolution Order (MRO) in new-style classes?但是在这个问题中,一些像 Alex Martelli 这样的程序员说它使用了深度优先的方法,我对此表示怀疑。
例子:
class H():
def m(self):
print("H")
class G(H):
def m(self):
print("G")
super().m()
class I(G):
def m(self):
print("I")
super().m()
class F(H):
def m(self):
print("F")
super().m()
class E(H):
def m(self):
print("E")
super().m()
class D(F):
def m(self):
print("D")
super().m()
class C(E, F, G):
def m(self):
print("C")
super().m()
class B():
def m(self):
print("B")
super().m()
class A(B, C, D):
def m(self):
print("A")
super().m()
x = A()
x.m()
因此,如果我基于 MRO 构建图表,那么根据深度优先它应该遵循以下内容:
路径应该是:
A-->B-->C-->E-->F-->G-->D-->H
但是如果你运行上面的代码,你会得到:
A
B
C
E
D
F
G
H
因为它遵循这条路径:
A-->B-->C-->E-->D-->F-->G-->H
现在,我对节点“D”或“D”类的深度感到困惑,它首先出现在早期,而在 MRO 中它出现在后面。
这里发生了什么?