Ist es sicher, eine überschriebene Methode von __init __ () aufzurufen?

9

Dies ist ein Follow-up von diese Frage :

Effektive Java 2. Ausgabe, Punkt 17: Design und Dokument für die Vererbung, oder verbieten Sie es:

  

Es gibt einige weitere Einschränkungen, die eine Klasse erfüllen muss, um Vererbung zuzulassen. Konstruktoren dürfen keine überschreibbaren Methoden direkt oder indirekt aufrufen. Wenn Sie diese Regel verletzen, führt dies zu einem Programmfehler. Der Superklassenkonstruktor wird vor dem Unterklassenkonstruktor ausgeführt, sodass die überschreibende Methode in der Unterklasse aufgerufen wird, bevor der Unterklassenkonstruktor ausgeführt wurde. Wenn die überschreibende Methode von einer vom Unterklassenkonstruktor durchgeführten Initialisierung abhängt, verhält sich die Methode nicht wie erwartet.

Da wir nur den Initialisierungsaspekt des Java-Konstruktors berühren, gehe ich davon aus, dass es sicher ist, den Java-Konstruktor in dieser Frage mit Pythons __init__() zu vergleichen.

Ich rate da in Python Ich habe die Flexibilität zu entscheiden, wann ich (nach der Initialisierung der Datenattribute meiner aktuellen Klasse in diesem Fall) das __init__() meines Vorfahren im Vergleich zu Java aufrufen soll, wo super() sein muss erste Anweisung im Aufruf eines Konstruktors, kann ich sicher sein, überschriebene Methoden von __init__() ?

aufzurufen

Wenn ich das oben Erwähnte richtig einschätze, würde ich dann nicht als Vorfahr-Klassen-Designer meinem Unterklassen-Designer ausgeliefert sein? Wenn der Unterklassen-Designer my __init__() aufruft, bevor er seine Datenattribute initialisiert, die von einer seiner überschriebenen Methoden verwendet werden, und ich diese Methode anrufe, führe ich zu einem Programmfehler!

    
Vaibhav Bajpai 28.07.2011, 12:18
quelle

1 Antwort

5
  

Ich könnte sicher sein, überschriebene Methoden von __init__() ?

aufzurufen

Sie sind. Die self -Bindung ist bereits erfolgt, bevor __init__() ausgewertet wurde.

  

Ahnen-Klassen-Designer, der meinem Unterklassen-Designer ausgeliefert wird?

Das ist allgemein wahr und hat nichts mit __init__() oder irgendetwas anderem zu tun.

Unterklassenentwickler können alles tun. Auch das ist Python: Sie haben Ihre Quelle und können diese auch ändern.

  

Wenn der Unterklassen-Designer my __init__() aufruft, bevor er seine Datenattribute initialisiert, die von einer seiner überschriebenen Methoden verwendet werden, und ich diese Methode anrufe, führe ich zu einem Programmfehler!

Richtig. Die Art und Weise, wie dies geschieht, hat der Unterklassen-Designer einen Namen gewählt, den Sie bereits verwendet haben. Sie versicherten, dass das Programm durch die Wahl ihres Namens scheitern würde.

    
S.Lott 28.07.2011, 12:40
quelle

Tags und Links