Ich verstehe, dass Python nicht die Reihenfolge der Zerstörung von Objekten am Ende des Programms garantiert, oder sogar, dass es passieren wird.Warum zerstört Python Klassenvariablen vor Objekten?
So verstehe ich, dass eine Klasse Destruktor kann nicht auf globale Variablen, einschließlich anderer Module verlassen.
Aber ich hätte gedacht, dass Objekte der Klasse zerstört werden müssten, bevor die Klasse zerstört wird. Offensichtlich nicht:
class A(object):
count = 0
def __init__(self):
A.count += 1
print 'Creating object, there are now', A.count
def __del__(self):
A.count -= 1
print 'Destroying object, there are now', A.count
a1 = A()
a2 = A()
auf Windows 7 x64 Python v2.7.3 ich:
Creating object, there are now 1
Creating object, there are now 2
Exception AttributeError: "'NoneType' object has no attribute 'count'" in <bound
method A.__del__ of <__main__.A object at 0x0234B8B0>> ignored
Exception AttributeError: "'NoneType' object has no attribute 'count'" in <bound
method A.__del__ of <__main__.A object at 0x0234BE90>> ignored
ich die Auswirkungen von How do I correctly clean up a Python object? verstehen. 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 Klasse-Shared-Variablen gespeichert tatsächlich“
(Ja, ich verstehe, dass dies einen Kontext-Manager behoben werden kann, oder auch einfach:
del a1
del a2
das Objekt zu zerstören bevor die Klasse zerstört wird.)
Was ist mit '.__ class__' auf der Instanz? – FatalError
@FatalError: Sie haben Recht, das Referenzproblem ist ein Ablenkungsmanöver. Das Problem besteht nicht darin, dass die Klasse selbst gelöscht wurde, sondern dass die globale Variable, die darauf verweist, auf None gesetzt wurde. Ich habe meine Antwort bearbeitet. – BrenBarn
Seltsamerweise bekomme ich das gleiche Verhalten, wenn ich es mit '.__ class__' versuche. Es sieht so aus, als wäre es auch auf "None" eingestellt, bevor in diesem Fall "__del__" aufgerufen wird, was irgendwie überraschend ist. – FatalError