Baumstrukturen und Garbage Collection

26/08/2008 - 23:36 von Markus Brueckner | Report spam
Hi,

ich habe mir folgende simple Klasse als Basis für eine Baumstruktur
implementiert (abgespeckte Version zur Verdeutlichung meiner Frage):

class Node(object):
def __init__(self):
self.__parent = None
self.__children = []

def setParent(self, parent):
self.__parent = parent

def addChild(self, item):
self.__children.append(item)
item.setParent(self)

Soweit, so übersichtlich. Allerdings besteht hier ja zwischen parent und
child eine gegenseitige Abhàngigkeit, die nach meinem Verstàndnis den
Garbage-Collector aus dem Tritt bringen sollte. Ist das soweit richtig?
Wenn ja, dann würde ich eine "destroy"-Methode implementieren, die alle
__parent auf None setzt und damit die Abhàngigkeit auflöst.

Danke schonmal
Bis dann
Markus
"Wir" steht natürlich für mich und mein kleines, grünes, ab und an auf
meiner Schulter sitzend laut schimpfendes IOS/OSI Schichtenmodell...
- Achim Friedland in tui.talk
 

Lesen sie die antworten

#1 Marc BlackJack Rintsch
27/08/2008 - 00:43 | Warnen spam
On Tue, 26 Aug 2008 23:36:33 +0200, Markus Brueckner wrote:

class Node(object):
def __init__(self):
self.__parent = None
self.__children = []

def setParent(self, parent):
self.__parent = parent

def addChild(self, item):
self.__children.append(item)
item.setParent(self)

Soweit, so übersichtlich. Allerdings besteht hier ja zwischen parent und
child eine gegenseitige Abhàngigkeit, die nach meinem Verstàndnis den
Garbage-Collector aus dem Tritt bringen sollte. Ist das soweit richtig?



Nein, damit kommt der Garbage-Collector klar.

Wenn ja, dann würde ich eine "destroy"-Methode implementieren, die alle
__parent auf None setzt und damit die Abhàngigkeit auflöst.



Du könntest die Rückverweise auf die Elternknoten mit dem `weakref`-Modul
machen, dann werden die Objekte bei CPython schneller wieder
freigegeben. Das würde ich aber nur machen, wenn das wirklich zu einem
echten Problem im laufenden Betrieb werden würde. Ansonsten fàllt das
IMHO in die Kategorie "premature optimization".

Du solltest eventuell mal PEP 008, den Style Guide, wegen der
Namensgebung konsultieren und die doppelten führenden Unterstriche
überdenken. Das ist kein "private"-Ersatz sondern ein Mechanismus um
Namenskollisionen bei tiefen Vererbungshierarchien oder Mehrfachvererbung
zu vermeiden. Tiefe Vererbungshierarchien sind in Python unüblich und
Mehrfachvererbung ist auch eher selten anzutreffen.
Implementierungsdetails werden per Konvention mit *einem* führenden
Unterstrich gekennzeichnet.

Ich würde `parent` und `children` wahrscheinlich sogar "öffentlich"
machen, denn triviale getter/setter sind in Python ebenfalls verpönt.
Such mal im Netz nach "Python is not Java".

Ciao,
Marc 'BlackJack' Rintsch

Ähnliche fragen