Warum wird __init__ bei der zweiten Initialisierung eines Objekts vor __del__ aufgerufen?

8

Betrachten Sie den folgenden Beispielcode

%Vor%

Das Erstellen des Objekts in der Schleife sollte sicherstellen, dass der Destruktor von A aufgerufen wird, bevor das neue A-Objekt erstellt wird. Aber anscheinend passiert folgendes:

  

Initialisiere Objekt 1

     

Initialisiere Objekt 2

     

Löschen von Objekt 1

     

Löschen von Objekt 2

Warum wird der Destruktor von Objekt 1 erst aufgerufen, nachdem das neue Objekt initialisiert wurde? Ist das ein beabsichtigtes Verhalten? Ich weiß, dass die for-Schleife in Python keinen eigenen Bereich hat. In C ++ zum Beispiel würde der Destruktor von 1 sicherlich vor dem Konstruktor für Objekt 2 aufgerufen werden (zumindest wenn das Objekt innerhalb der Schleife deklariert ist).

In meinem Programm möchte ich sicherstellen, dass das alte Objekt gelöscht wird, bevor das neue Objekt erstellt wird. Gibt es eine andere Möglichkeit, außer dass a explizit am Ende der for-Schleife gelöscht wird?

Vielen Dank im Voraus.

    
shark.dp 18.04.2011, 12:34
quelle

3 Antworten

11

Die Erstellung des zweiten Objekts erfolgt, bevor der Name erneut gebunden wird und das erste Objekt entsorgt wird.

  1. Der erste A wird instanziiert.
  2. a ist gebunden.
  3. Die zweite A wird instanziiert.
  4. a wird zurückgeholt, und der erste A wird entsorgt.
  5. Das Programm endet und der zweite A wird entsorgt.
Ignacio Vazquez-Abrams 18.04.2011, 12:35
quelle
9

Sie können sich bei der Planung von Lebensdauerabhängigkeiten nicht auf die Implementierungsdetails des Garbage Collectors verlassen. Sie müssen dies auf die eine oder andere Weise tun.

Kontextmanager fallen mir zum Beispiel ein:

%Vor%

Dies erzeugt die folgende Ausgabe:

%Vor%     
David Heffernan 18.04.2011 12:40
quelle
0

Wenn Sie davon ausgehen, dass das Objekt beim Beenden der Schleife als endgültiger Wert definiert werden soll, löschen Sie das Objekt nicht explizit am Ende der for-Schleife, sondern bei Anfang der Schleife, wie folgt:

%Vor%

Das druckt:

%Vor%

(Hinweis: Ignatio hat recht, warum es so funktioniert, wie es funktioniert, aber KennyTM hat auch Recht, um es deutlicher zu machen, was passiert, sollten Sie es mindestens dreimal durch die Schleife gehen lassen.)

    
Dave Burton 20.07.2012 20:34
quelle

Tags und Links