Seite 1 von 1

Instanzen einer Metaklasse löschen

Verfasst: Montag 22. September 2008, 20:43
von OpaH.
Für folgende bekannte Technik bei Instanzen konventioneller Klassen ...

Code: Alles auswählen

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:

Code: Alles auswählen

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.

Verfasst: Montag 22. September 2008, 20:50
von Leonidas
Hallo OpaH., willkommen im Forum,

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.

Verfasst: Montag 22. September 2008, 21:33
von Trundle
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.

Re: Instanzen einer Metaklasse löschen

Verfasst: Montag 22. September 2008, 22:29
von OpaH.
Leonidas schrieb:
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.

Verfasst: Montag 22. September 2008, 22:45
von Leonidas
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.

Verfasst: Dienstag 23. September 2008, 21:11
von OpaH.
Bin nunmehr auf den Pfad der Tugend zurückgekehrt und lasse die Finger von __del__. Werde zum "with" - Statement greifen. Danke nochmals.

Verfasst: Dienstag 23. September 2008, 22:38
von Leonidas
OpaH. hat geschrieben:Bin nunmehr auf den Pfad der Tugend zurückgekehrt und lasse die Finger von __del__. Werde zum "with" - Statement greifen.
Deine Weisheit spricht aus deinen Worten. Fortan von der der hellen Seite der Macht du dich führen lässt.

Verfasst: Dienstag 23. September 2008, 22:50
von lunar
Leonidas hat geschrieben:
OpaH. hat geschrieben:Bin nunmehr auf den Pfad der Tugend zurückgekehrt und lasse die Finger von __del__. Werde zum "with" - Statement greifen.
Deine Weißheit spricht aus deinen Worten. Fortan von der der hellen Seite der Macht du dich führen lässt.
Weisheit schreibt man mit s ;)

SCNR
lunar

Verfasst: Dienstag 23. September 2008, 22:52
von Leonidas
lunar hat geschrieben:Weisheit schreibt man mit s ;)
Meine Weisheit stammt eben aus dem Edit-Button.