Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
class A(object):
def __del__(self):
# ...
print 'deleted'
a = A()
del(a)
... mit der sich anschließenden Ausgabe von 'deleted' (wenn keine weitere Referenz auf das Objekt a besteht), möchte ich für Klassen anwenden, die aus einer Metaklasse gewonnen werden:
class Meta(type):
def __del__(cls):
# ...
print 'del'
class M(object):
__metaclass__ = Meta
del(M)
Leider bleibt das del(M) ohne sichtbare Wirkung. Stimmt die Funktionsdefinition in der Metaklasse nicht oder gibt es noch Referenzen auf M?
Wer weiß hier Rat? Vielen Dank für die Mühe.
Lies doch diese Seite, bei __del__steht eine Warnung. Kurzfassung: __del__ nicht nutzen, außer man weiß ganz genau was es macht. Ich habe es in den paar Jahren wo ich Python nutze kein einziges Mal gebraucht. Wozu sollte man auch Referenzen explizit löschen, wenn der GC doch auch selbst machen kann.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ich bezweifle aber stark, dass man mit Hilfe einer Metaklasse mitbekommt, wann eine Klasse verschwindet (auch wenn die Klasse so gesehen ein Exemplar der Metaklasse ist), zumal der Interpreter wohl noch Referenzen auf die Klasse hält. Hat man z.B. eine Klasse `` Spam`` in einem Modul `spam` und lädt das Modul neu (mit ``reload``), dann spuckt sowohl [mod]gc[/mod] als auch ``object.__subclasses__()`` zwei verschiedene `spam.Spam`s aus.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Kurzfassung: __del__ nicht nutzen, außer man weiß ganz genau was es macht. Ich habe es in den paar Jahren wo ich Python nutze kein einziges Mal gebraucht.
Das Ziel meiner Versuche ist eine Applikation, bei der Klassen und ihre Attribute im Dialog definiert, gespeichert und bearbeitet werden können. Das Löschen einer Klasse zieht dann noch einige Verwaltungsaufgaben nach sich, die auf diesem Wege einfach angestoßen werden sollten.
Danke für den Verweis auf die Python-Dokumentation. Ich werde also noch ein bisschen probieren, denn möglich scheint dieser Weg ja doch zu sein.
Sinnvoller ist es da mit einer ``close()`` Methode zu arbeiten und Context Manager (``with`` Statement) zu verwenden, die automatisch nach dem durchlaufen die abschließenden Sachen ausführen. In ``__del__`` sollte man nie Code schreiben, der ausgeführt werden muss, weil dessen Aufruf eben nicht immer garantiert wird. Und Code der nicht ausgeführt werden muss ist im großen und ganzen überflüssig.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice