Seite 1 von 1

__del__ methode wird nicht aufgerufen bei del objekt

Verfasst: Dienstag 29. Juni 2004, 02:41
von killroy84
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

Verfasst: Dienstag 29. Juni 2004, 08:20
von NEBULA
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

Verfasst: Dienstag 29. Juni 2004, 14:14
von killroy84
danke für die schnelle antwort :)
dann werd ich mich mal daran machen das anzupassen.

Re: __del__ methode wird nicht aufgerufen bei del objekt

Verfasst: Dienstag 29. Juni 2004, 15:06
von joerg
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

Verfasst: Dienstag 29. Juni 2004, 16:37
von Dookie
Hi,

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


Gruß

Dookie

Verfasst: Dienstag 29. Juni 2004, 16:54
von killroy84
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.

Verfasst: Dienstag 29. Juni 2004, 18:02
von Dookie
tja, da heissts halt sauber programmieren und Resourcen nur so lange halten wie sie auch gebraucht werden.


Gruß

Dookie