私は多相継承の例があるExpert Python Programmingを読んでいます。本の著者は説明しましたが、私はそれを理解できませんでしたので、別の見方をしたいと思います。オブジェクトはPythonで2回作成されました
この例では、オブジェクトB
が2回作成されています。
私に直感的な説明を教えてください。
In [1]: class A(object):
...: def __init__(self):
...: print "A"
...: super(A, self).__init__()
In [2]: class B(object):
...: def __init__(self):
...: print "B"
...: super(B, self).__init__()
In [3]: class C(A,B):
...: def __init__(self):
...: print "C"
...: A.__init__(self)
...: B.__init__(self)
In [4]: print "MRO:", [x.__name__ for x in C.__mro__]
MRO: ['C', 'A', 'B', 'object']
In [5]: C()
C
A
B
B
Out[5]: <__main__.C at 0x3efceb8>
本の著者は言った:
これは、このように
super(A, self).__init__()
コールB
のコンストラクタ
作り、原因 Cのインスタンスで作られてA.__init__(self)
コールに起こります私はそのアイデアを得ていないのですか?A.__init__(self)
コールはsuper(A, self).__init__()
コールB
のコンストラクタを呼び出します
なぜあなたは 'スーパーを使用していない。ここでは代わりに
A.doit(self)
の私が直接
super(A, self).doit()
を使用して、それがまたB.doit()
呼び出しの結果は、ここに出力されます'Cのinitメソッドでは? –私はオブジェクトがPythonでどのように作成されているかを理解したいと思います。 – Bryan
'super'呼び出しを '親クラスのメソッドを呼び出す'ではなく 'MROの次のメソッドを呼び出す'と考えると、この動作は理にかなっています。この場合、Bが2回表示されるのは、superがBのinitを(Aのinitによって)呼び出されるように既に設定しているためです。したがって、CからB.initを明示的に呼び出すと、2回目の呼び出しが発生します。 –