Warum zerstört Python Klassenvariablen vor Objekten?

8

Ich verstehe, dass Python nicht die Reihenfolge der Zerstörung von Objekten am Ende des Programms garantiert, oder sogar, dass es passieren wird.

So verstehe ich, dass der Destruktor einer Klasse sich nicht auf globale Variablen verlassen kann, einschließlich anderer Module.

Aber ich hätte gedacht, dass Objekte der Klasse zerstört werden müssten, bevor die Klasse zerstört wird. Offensichtlich nicht:

%Vor%

Unter Windows 7 x64 Python v2.7.3 bekomme ich:

%Vor%

Ich verstehe die Implikationen von Wie reinige ich ein Python-Objekt korrekt? . Aber dieser Fall ist für Klassenvariablen (freigegeben oder statisch für meine C ++ - Freunde). Sicherlich hat die Instanz einen Verweis auf die Klassenvariable, die nicht zuerst zerstört werden sollte, da wir noch einen Verweis darauf haben?

Ist es ein Problem oder ein Fehler, die Klasse vor Objekten dieser Klasse zu zerstören? Vielleicht ist meine Frage "Wo sind tatsächlich gemeinsam genutzte Variablen gespeichert?"

(Ja, ich verstehe, dass dies mit einem Kontextmanager oder einfach:

behoben werden kann) %Vor%

um das Objekt zu zerstören, bevor die Klasse zerstört wird.)

    
Peter 14.03.2013, 04:12
quelle

1 Antwort

6
  

Vielleicht ist meine Frage "Wo werden Klassen-Shared-Variablen tatsächlich gespeichert?"

Wenn das Ihre Frage ist, lautet die Antwort "auf die Klasse".

Um Ihre größere Frage zu beantworten: Wie Sie festgestellt haben, kann sich __del__ nicht auf globale Variablen verlassen --- aber A ist eine globale Variable, auf die Sie sich nicht verlassen können. Interessanterweise kann ich in den Dokumenten keine offizielle Aussage dazu finden, aber im Internet gibt es verschiedene Hinweise darauf, dass __del__ keine globalen Variablen verwenden kann. Hier ist eins:

  

Wenn ein Python-Programm beendet wird, werden die globalen Variablen in jedem Modul auf None gesetzt. Die Reihenfolge, in der dies geschieht geschieht undefined

Es funktioniert, wenn Sie auf die Zählung über self.__class__.count statt A.count zugreifen. (Dies ist auch der Fall, wenn Sie self.count verwenden.)

    
BrenBarn 14.03.2013 04:16
quelle

Tags und Links