2017-06-28 3 views
1
class A(object): 
    def __init__(self): 
     print('A.__init__()') 

class D(A): 
    def __init__(self): 
     super(A, self).__init__() 
     print('D.__init__()') 

D() 

出力は次のようになります。なぜsuper(A、self).__ init __()はAの__init __()を呼び出さないのですか?

D.__init__() 

これは私には予想外です。私の理解によると、super(A, self).__init__()Aのコールを呼び出すはずだったので、 "init()"と印刷してください。

私はsuper()についていくつかの他の質問を読んだことがありますが、私は彼らが私の質問に正確に答えるとは思わないのです。

私のpythonは3.5.3です。

+1

'super(D、self)'または 'super()'に変更しました – vaultah

+1

'super。'よりも直感的な 'A .__ init __(self)'構文が常に見つかりました。 –

+2

vaultahが意味することは、あなたが 'A'の_parent_のコンストラクタを呼び出すことです。 –

答えて

2

理由あなたのいないあなたは、あなたがの__init__()関数を呼び出しているためである期待するものになっA親クラス - objectある - そうA__init__()が呼び出されることはありません。あなたはADの親クラスのコンストラクタを呼び出す代わりにsuper(D, self).__init__()を実行する必要があります。

>>> class A(object): 
    def __init__(self): 
     print('A.__init__()') 


>>> class D(A): 
    def __init__(self): 
     super(D, self).__init__() # Change A to D 
     print('D.__init__()') 


>>> D() 
A.__init__() 
D.__init__() 
<__main__.D object at 0x7fecc5bbcf60> 
>>> 

また、Pythonの3にあなたは、もはや明示的objectから継承しなければならないことに注意します。すべてのクラスはデフォルトでobjectから継承されます。 Python 2のドキュメントのSection 3.3 New-style and old-style classesを参照してください。

+0

詳細な回答ありがとうございます。また、オブジェクトの余分な先端のために。 – Roy

+0

他の読者のために。私もJean-Fを見つけました。 F.のOPの有用なコメント、すなわち、https://stackoverflow.com/questions/9575409/calling-parent-class-init-with-multiple-inheritance-whats-the-right-wayを参照してください。 https://rhettinger.wordpress.com/2011/05/26/super-considered-super/を参照してください。 – Roy

関連する問題