2017-06-28 2 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() 

Die Ausgabe lautet:Warum super (A, self) .__ init __() ruft nicht A's __init __() auf?

D.__init__() 

Dies ist für mich unerwartet. Nach meinem Verständnis, sollte A 's ctor aufgerufen haben, sollte also gedruckt haben "A. init()".

Ich habe ein paar andere Fragen über super() gelesen, aber ich denke nicht, dass sie meine Frage genau beantworten.

Mein Python ist 3.5.3.

+1

Ändern Sie es in 'super (D, self)' oder 'super()' – vaultah

+1

Ich fand immer 'A .__ init __ (Selbst)' Syntax intuitiver als 'super'. –

+2

was vaulthah bedeutet ist, dass Sie den Konstruktor des _parent_ von 'A' aufrufen. –

Antwort

2

Der Grund Ihrer nicht bekommen, was Sie erwarten ist, weil Sie die __init__() Funktion von A ‚s Elternklasse - die object ist - so A‘ fordern s __init__() nie aufgerufen. Sie müssen super(D, self).__init__() tun, anstatt den Konstruktor von D ‚s Elternklasse aufzurufen, A:

>>> 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> 
>>> 

Beachten Sie auch, dass in Python 3 nicht mehr explizit von object erben müssen. Alle Klassen erben standardmäßig von object. Eine detaillierte Übersicht finden Sie in den Python 2-Dokumenten unter Section 3.3 New-style and old-style classes.

+0

Vielen Dank für die ausführliche Antwort. Und für den zusätzlichen Tipp auf "Objekt". – Roy

+0

Und zum Vorteil anderer Leser. Ich habe auch Jean-F gefunden. F. Kommentar zum OP nützlich, dh überprüfen Sie https://stackoverflow.com/questions/9575409/calling-parent-class-init-multiple-inheritance-whats-the-right-way, die in Term siehe https://rhettinger.wordpress.com/2011/05/26/super-considered-super/. – Roy

Verwandte Themen