Instanzen einer Metaklasse löschen

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.
OpaH.
User
Beiträge: 4
Registriert: Montag 22. September 2008, 19:58

Instanzen einer Metaklasse löschen

Beitragvon OpaH. » Montag 22. September 2008, 20:43

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 22. September 2008, 20:50

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Beitragvon Trundle » Montag 22. September 2008, 21:33

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)
OpaH.
User
Beiträge: 4
Registriert: Montag 22. September 2008, 19:58

Re: Instanzen einer Metaklasse löschen

Beitragvon OpaH. » Montag 22. September 2008, 22:29

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 22. September 2008, 22:45

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 Modvoice
OpaH.
User
Beiträge: 4
Registriert: Montag 22. September 2008, 19:58

Beitragvon OpaH. » Dienstag 23. September 2008, 21:11

Bin nunmehr auf den Pfad der Tugend zurückgekehrt und lasse die Finger von __del__. Werde zum "with" - Statement greifen. Danke nochmals.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 23. September 2008, 22:38

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.
Zuletzt geändert von Leonidas am Dienstag 23. September 2008, 22:51, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
lunar

Beitragvon lunar » Dienstag 23. September 2008, 22:50

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 23. September 2008, 22:52

lunar hat geschrieben:Weisheit schreibt man mit s ;)

Meine Weisheit stammt eben aus dem Edit-Button.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]