この質問にはすでに答えがあります。
これを考えてみましょう - 基本クラスA、Aから継承したクラスB、Bから継承したクラスC。コンストラクタで親クラスのコンストラクタを呼び出す一般的な方法は何ですか?それでも曖昧に聞こえるなら、ここにいくつかのコードがあります。
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()
これが私が今やる方法です。しかし、それはまだ少し一般的ではないように見えます - あなたはまだ手で正しい型を渡さなければならない。
今、使ってみましたself.__class__
super()への最初の引数として、しかし、明らかにそれは機能しません - あなたがそれをCのためのコンストラクタに入れた場合 - かなり公平、Bのコンストラクタが呼ばれます。 Bで同じことをしても、 "self"はまだCのインスタンスを指しているので、Bのコンストラクタを再度呼び出すことになります(これは無限再帰で終わります)。
今のところダイヤモンドの継承について考える必要はありません、私はこの特定の問題を解決することに興味があるだけです。
あなたがしている方法は確かに(Python 2.xのために)お勧めの方法です。
クラスが明示的にに渡されるかどうかの問題super
機能よりもスタイルの問題です。にクラスを渡すsuper
Pythonの「明示的は暗黙的より優れている」という哲学に適合します。
TypeError: super() argument 1 must be type, not classobj
この方法を使用します。私は何かが足りないのですか? - Leopdsuper()
新しいスタイルのクラスでのみ動作します。つまり、から継承する必要があります。object
。 - dF.
Python 3には、このように使えるように改良されたsuper()が含まれています。
super().__init__(args)
MyClassName.mro()
。私は間違っているかもしれませんが、最初に指定された親は、__init__
と呼ばれます。 - Cam Jackson
あなたは簡単に書くことができます:
class A(object):
def __init__(self):
print "Constructor A was called"
class B(A):
def __init__(self):
A.__init__(self)
# A.__init__(self,<parameters>) if you want to call with parameters
print "Constructor B was called"
class C(B):
def __init__(self):
# A.__init__(self) # if you want to call most super class...
B.__init__(self)
print "Constructor C was called"