[Python-de] python objekt löschen

Rene Freund rene at meder.de
Tue Aug 7 11:13:44 EDT 2001


Thx,

mit diesen paar Hinweisen kann ich schonmal ein paar neue Sachen
ausprobieren. Ich werde noch mal kurz schreiben, was ich zu deinen
kommentaren denke, am schluss versuche ich das problem nochmal
eindeutiger zu schildern.

> Du kannst in Python keine Objekte loeschen. Alles was du tun
> kannst, ist Referenzen zu kappen. Wenn die letzte Referenz zu
> einem Objekt verschwunden ist, dann fuehrt der Interpreter zuerst
> die __del__ Methode (falls vorhanden) des Objektes aus, und gibt
> danach den vom Objekt belegten Speicher wieder frei.  Ich vermute
> uebrigens, dass du nicht wirklich eine Klasse "loeschen" mochtest,
> sondern ein davon instantiiertes Objekt. Das ist nicht dasselbe!

Sorry, natürlich ist es nichtdasselbe. Ich will nur die Referenz(en)
auf das Objekt entfernen. Wenn alle Referenzen entfernt wurden, aber
keine __del__ methode existiert, gibt er einfach den Speicher frei??
Die (Problem)-Klasse wird in einem anderen (instanz-)klasse instanziert.

> Deine Beschreibung oben laesst nicht klar werden, woraus dein
> Problem eigentlich besteht. Es ist systembedingt gar nicht
> moeglich, dass ein Objekt auf "schon geloeschte Referenzeobjekte"
> verweist. Solange es einen solchen Verweis gibt, existieren auch
> diese Referenzobjekte noch. Dein Snippet verraet ebenfalls
> nichts, worueber man sich konkret aeussern koennte.

Wie gesagt, sorry, ich wusste nicht so genau wie ich es ausdrücken sollte,
da das Programm mit einer Windows fehlermeldung, das irgendetwas in
0167:xxxx in wx20.dll schiefgelaufen ist, abstürzt.
Das passsiert immer dann, wenn eine Gruppe von Objekten "gelöscht"
wird und neu initalisiert wird. Ohne die einbindung der Problemklasse
funktionuckelt das, also vermute ich, das python irgendwie nicht mit der
gegenseitigen Referenzierung klarkommt

> Noch als Randbemerkung: Denk immer daran, dass zirkulaere
> Verknuepfungen eine Freigabe vom Speicher verhindern, auch wenn
> die fraglichen Objekte vom Rest des Codes nicht mehr erreichbar
> sind. Diese Speicherlecks erkennst du daran, dass dein Programm
> mit der Zeit immer mehr RAM aufsaugt. Mit Python 2.x aendert sich
> da zwar einiges, damit habe ich mich aber noch nicht beschaeftigt.

Hmm, das sind zirkulare Verknüpfungen. Also folgendes Problem:
Ich habe eine Gruppe von Texteingabefeldern: Im einfachsten Bsp.
sind alle Felder in einer Liste angeordnet:
5 Felder in einer Zeile, die zeilenanzahl richtet sich nach Datensätzen.
Nun soll das letzte Feld einer Zeile einen Wert zugewiesen bekommen,
der sich nach einer bestimmten Formel aus den anderen 4 Feldern
zusammensetzt. Um die Verknüpfungen zu realisieren instanziere ich
in der Textfeldinstanz meine Verknüpfungsklasse. (ConCel)
Wenn nun eines der 4 (Basis)-Feldern einen anderen Wert annimmt
schickt es ein "Signal" an das Ziel. Dieses sammelt dann von den
Basen die Werte und rechnet seinen Wert aus.
Bei dieser Struktur müssen die Basen das Ziel "kennen" und umgedreht.
Untereinander "kennen" sich die Basen nicht.
Initialisiert wird die Verbindung immer vom letzten kreiirten Objekt (meist
das Ziel).
Das Ziel bekommt die Id's der Basen beim instanzieren mitgeliefert und
teilt den Basen mit das sie basen sind und es selbst das ziel dieser basen
ist.


Vor dieser Zeile findet ConCel heraus ob es ein ziel ist, wenn ja, dann
rufe basis.SetConnection auf und übergebe sich selbst(Ziel) und den
status(damit die basis weiss, das sie auch eine basis ist.) Der
Rückgabewert ist das Basisobjekt (siehe unten)

        self.link.append(dest.SetConnection(self,self.status))


In der basis werden die Daten(Referenz und status) eingetragen und eine
Referenz des eigenen Objektes zurückgegeben.

    def SetConnection(self,OtherConCel,status):
        self.status=status
        self.link.append([OtherConCel,status])
        return self

Nach diesem Code haben sie sich gegenseitig referenziert und können
miteinander kommunizieren. Nun? Wenn diese Klasse "gelöscht" wird,
dann stürzt P ab. Würde es etwas nützen in der __del__ methode des
Textfeldes, die instanz von ConCel auf None zu setzen?? Oder habe
ich weider einmal die grundlegene Aussage verpeilt??
Ich probiere jetzt noch ein bissl.

>
> Viel Spass!
*grins* Den habe ich, wie man sieht! =)

>
> -schorsch
>
> --
> Georg Mischler  --  simulations developer  --  schorsch at schorsch.com
> +schorsch.com+  --  lighting design tools  --  http://www.schorsch.com/

Auf jeden Fall Danke!

reen

----
Rene Freund                 nur ein toter bug ist ein guter bug
rene at meder.de




More information about the Python-de mailing list