私は(print()
へprint
を変更することで)のpython3にあなたのコードに変換し、いくつかのより多くのトレースステートメントを追加しました:
class A(object):
def __init__(self):
print("A", type(self).__mro__)
super(A, self).__init__()
print("/A")
class B(object):
def __init__(self):
print("B", type(self).__mro__)
super(B, self).__init__()
print("/B")
class C(A,B):
def __init__(self):
print("C")
A.__init__(self)
print("ca/b")
B.__init__(self)
print("/C")
C()
がここに出力です:
出力を見てみると
C
A (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
B (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
/B
/A
ca/b
B (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
/B
/C
、あなたはC.__init__
メソッドの呼び出しが起こって、および「C」を印刷して確認することができます。次にA.__init__
を直接呼び出します(これは間違いですsuper
!)。
A.__init__
コールは__mro__
属性を含めてそのメッセージを、表示します。シーケンスはC→A→B→Objectの順で見ることができます。それはA.__init__
内からsuper()
への呼び出しは、クラスB
を参照しようとしていることを意味するので、これは重要です。また、あなたがそれらを許可すれば、自動的にA.__init__
を呼び出しているだろうC.__init__
内側からsuper
に呼び出します。
B.__init__
は、前述のようにA.__init__
内のsuper
参照によって呼び出されます。恐らくObject.__init__
が呼び出され、何も印刷されません。 ;-)
両方B.__init__
とA.__init__
リターン、我々は中間メッセージca/b
を参照して、B.__init__
への直接呼び出しが行われます。メッセージを出力しますが、super
フォームB.__init__
への参照は何も行いません。B
はMROの末尾にあるためです。
super()
メカニズムは、このMROのすべてのものを処理できます。 A.__init__(self)
を呼び出す必要はありません。とても素晴らしいことだ
class C(A,B):
def __init__(self):
print("C")
super(C, self).__init__()
:代わりに、あなただけ
super
ハンドルを、C.__init__
内部が、これをやってみましょうことができます!ありがとうございました – TreeCatCat