これを考える - 基本クラスA、Bを継承するクラスC、コンストラクタで親クラスのコンストラクタを呼び出す一般的な方法は何ですか?まだあまりにも曖昧に聞こえる場合は、ここにいくつかのコードがあります。Pythonの連鎖呼び出し親コンストラクタ
class A(object):
def __init__(self):
print "Constructor A was called"
class B(A):
def __init__(self):
super(B,self).__init__()
print "Constructor B was called"
class C(B):
def __init__(self):
super(C,self).__init__()
print "Constructor C was called"
c = C()
これは私が今やっている方法です。しかし、それはまだあまりにも一般的ではないように思えます - あなたは手で正しいタイプを渡す必要があります。
ここでは、super()の最初の引数としてself.__class__
を使用しようとしましたが、明らかに動作しません。Cのコンストラクタに入れた場合、Bのコンストラクタが呼び出されます。 Bで同じことをすると、 "self"はCのインスタンスを指しているので、Bのコンストラクタをもう一度呼び出すことになります(これは無限回帰で終了します)。
今のところダイヤモンドの継承について考える必要はありません。私はこの特定の問題を解決することに興味があります。
を「しかし、それはまだ少しあまりにも非ジェネリックようだ - あなたは手で正しいタイプを渡す必要があります。 "クラス名をsuper()に渡しています。あなたはスーパークラスか何かを知る必要はありません。これは非一般的な仕組みですか?どのような問題が生じますか?これが壊れた例を挙げることができますか? –
私はこの質問に答える準備ができていません。しかし、とにかく、クラス名を変更するとどうなるでしょうか?このような連鎖を自動化するデコレータ関数を記述したいのですが?今、私はこれが不可能だが、質問するときに私はそれを知らなかったことを知る。 – shylent