1

初期化について 1 つだけ質問があります。Python では、Multiply 継承を行う場合、子クラスのスーパー関数を呼び出すことと、それぞれを個別に呼び出すことの違いは何ですか?

classA(B,C)

super(A,self).__init__()

#---and---#

B.__init__(self)
C.__init__(self)

ありがとう

4

1 に答える 1

1

主な違いは、クラス B と C が共通の祖先を持っている場合super()、その祖先__init__()は一度しか呼び出されないことです。例のように親の__init__()メソッドを明示的に呼び出すと、共通の祖先のメソッド__init__()が 2 回呼び出されることになります。

super()がこれをどのように達成するかについては、 Guido の説明から読むことができます。

以下は、親への明示的な呼び出し__init__()と、共通の祖先を 2 回呼び出す方法のデモンストレーションです。

>>> class A(object):
...   def __init__(self):
...     print "A"
... 
>>> class B(A):
...   def __init__(self):
...     A.__init__(self)
...     print "B"
... 
>>> class C(A):
...   def __init__(self):
...     A.__init__(self)
...     print "C"
... 
>>> class D(B,C):
...   def __init__(self):
...     B.__init__(self)
...     C.__init__(self)
...     print "D"
... 
>>> D()
A
B
A
C
D
<__main__.D object at 0x106de1d10>
>>> 

そして、これは何が起こるかですsuper()

>>> class A(object):
...   def __init__(self):
...     print "A"
... 
>>> class B(A):
...   def __init__(self):
...     super(B,self).__init__()
...     print "B"
... 
>>> class C(A):
...   def __init__(self):
...     super(C,self).__init__()
...     print "C"
... 
>>> class D(B,C):
...   def __init__(self):
...     super(D,self).__init__()
...     print "D"
... 
>>> D()
A
C
B
D
<__main__.D object at 0x10d34ec90>
>>> 
于 2013-02-25T15:06:10.683 に答える