Python 2.7 では、特定のクラスE
からルートへのAN 継承チェーンを再構築しようとしていA
ます。以下に示すようにダイヤモンドの継承の問題がありますが、THE パスではなくパスに興味があるので、うまくいくはずです。自分が(こうして)やるべきことなのかは疑問ですが、今は自分が何を誤解しているのかを知りたいだけです...
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()
「クラスA」はどこにあるsuper(C, E())
べきですか?最初の行の C が DI だったら (ある程度) 理解できたでしょうが、私の考えでは、2 行目は間違いなく A である必要があります。
何か助けはありますか?
編集:私の理解はその呼び出しでした
super(C, obj).name()
C の線形化は であるため、"A" という名前になり[C, A, object]
ます。
しかし、これはsuper(C, obj).name()
明らかに意味するものではありません。それはまだobjの完全な線形化を使用しています: [E, C, D, A, object]
(@Martijn Pietersのおかげで)、それはちょうど(後) Cで始まります.したがって、DはAの前に来ます.