在 Python 2.7 中,我试图重建从某个类E
到 root的继承链A
。如下所示,有一个菱形继承问题,但我对路径感兴趣,而不是路径,所以它应该可以工作。这是否是我应该做的事情(这种方式)是值得怀疑的,但现在我只想知道我误解了什么......
class A(object):
@classmethod
def supah(thisCls):
return [cls for cls in thisCls.__bases__ if issubclass(cls, A)]
def name(self):
return 'A'
class C(A):
def name(self):
return 'C'
class D(A):
def name(self):
return 'D'
class E(C, D):
def name(self):
return 'E'
current = E
while True:
try:
print current, super(current, E()), super(current, E()).name()
except AttributeError:
break
current = current.supah()[0]
输出
<class '__main__.E'> <super: <class 'E'>, <E object>> C
<class '__main__.C'> <super: <class 'C'>, <E object>> D
<class '__main__.A'> <super: <class 'A'>, <E object>>
D在那里做什么?它在呼唤
super(C, E()).name()
super(C, E())
“A级”应该在哪里,对吧?如果第一行的 C 是 DI,那么(在某种程度上)可以理解,但在我看来,第二行绝对应该是 A。
有什么帮助吗?
编辑:我的理解是调用
super(C, obj).name()
将导致名称“A”,因为 C 的线性化是[C, A, object]
.
然而,这显然不是什么super(C, obj).name()
意思。它仍然使用 obj 的完全线性化:([E, C, D, A, object]
感谢@Martijn Pieters),它只是从(之后)C 开始。因此 D 在 A 之前。