__del__ methode wird nicht aufgerufen bei del objekt

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.
Antworten
killroy84
User
Beiträge: 7
Registriert: Samstag 13. Dezember 2003, 00:28

hi,
habe ein Problem mit dem Überladen der __del__ Methode.
Und zwar habe ich ein Objekt, auf das es in anderen Objekten (Listen/Dictionaries z.B.) Verweise gibt. Diese sollen nun entfernt werden, wenn das Objekt selbst gelöscht wird.
Deswegen will ich die __del__ Methode überladen.
Nun habe ich einfach mal eine print Anweisung reingesetzt, um zu testen, ob die methode überhaupt aufgerufen wird, was dann allerdings nicht der Fall war :(
kann mir da wer helfen?

thx im vorraus,
k84
NEBULA
User
Beiträge: 25
Registriert: Mittwoch 5. März 2003, 11:59
Wohnort: Kleve/NRW

Ich habs grad mal ausprobiert und wenn ich mein Ergebnis richtig interpretiere wird die __del__-Methode einer Instanz dann aufgerufen wenn der letzte Verweis auf diese Instanz geloescht wird.

Beispiel:

Code: Alles auswählen

Beispiel 1

class testklasse:

    def __del__(self):
        print "DEL"
        
testinstanz = testklasse()
del testinstanz 
---> __del__ wird ausgefuehrt, da nur ein Verweis auf testinstanz
vorhanden ist und dieser hier geloescht wird

Beispiel 2

class testklasse:

    def __del__(self):
        print "DEL"
        
testinstanz = testklasse()
testarray = [testinstanz]

del testinstanz 
---> __del__ wird nicht ausgefuehrt, da im testarray noch
ein Verweis auf testinstanz vorhanden ist

del testarray 
---> __del__wird ausgefuehrt, da mit dem loeschen des Arrays der letzte Verweis auf testinstanz geloescht wird
killroy84
User
Beiträge: 7
Registriert: Samstag 13. Dezember 2003, 00:28

danke für die schnelle antwort :)
dann werd ich mich mal daran machen das anzupassen.
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Aus der Python-Doku:

"It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits."

Auf __del__ beim Programmende darf man sich nicht verlassen!

Jörg
"Sie sind nicht berechtigt, unrechtmäßige Kopien dieses Datenträgers zu erstellen." - Microsoft-Weisheit auf einer CD von MS-VisualC++-6.0
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi,

um Funktionen/Methoden beim Programmende auszuführen gibts atexit.


Gruß

Dookie
killroy84
User
Beiträge: 7
Registriert: Samstag 13. Dezember 2003, 00:28

Ne, ich wollte ja, dass alle verweise verschwinden wenn ich
del <objekt>
ausführe.
Scheint nur halt nicht so ganz machbar zu sein, zumindest nicht mit einfachem Überladen der __del__ methode, wenn ich das richtig verstanden habe (da die __del__ methode erst aufgerufen wird, wenn alle Verweise schon weg sind)
Der Auszug aus der Doku bezog sich ja nur auf den Aufruf bei Programmende.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

tja, da heissts halt sauber programmieren und Resourcen nur so lange halten wie sie auch gebraucht werden.


Gruß

Dookie
Antworten