[Python-de] rekursiver aufruf in klasse

Georg Mischler schorsch at schorsch.com
Wed Aug 8 09:46:02 EDT 2001


Frank Immich wrote:

> Hallo zusammen , ich bräuchte ein wenig Nachhilfe in Bezug auf Klassen.
> Verwenden und selber schreiben ist doch ein Unterschied...
> Wie realisiere ich einen rekursiv Aufruf in einer Klasse. Beispiel :
> Ich habe ein Dictionary mit jeweils (child:parent , child:parent.....). Das
> ganze ist verschachtelt.
> Die Funktion ist ganz einfach:
>
> dic = {.......}
> idlist =[]
> def getchilds(id):
> 	for child,parent in dic.items():
> 		if parent == id:
> 			idlist.append(child)
> 			getchilds(child)
> 	return idlist
>
> print getchilds(id_no)
>
> Wie macht man das als Klasse ????
> Mein Versuch ist bis jetzt :
>
> class getc:
>     def __init__(self):
>         self.idlist =[]
>         self.dic = dic
>     def getid(self, id):
>         self.id = id
>         for child,parent in self.dic.items():
>                     if parent == self.id:
>                             self.idlist.append(child)
>                             self.getid(child)
>         return self.idlist
>
> Das klappt aber nicht...läuft immer nur einmal durch.
> Leider steige ich durch diese ganze Namesraumgeschichte nicht durch.
>

Ich sehe keinen funktionalen Unterschied zwischen getchilds()
und getid() (die Zuweisung "self.id = id" ist ueberfluessig, hat
aber sonst keinen negativen Einfluss).

Ich vermute daher, dass das Problem eher darin liegt, wie und
wann das globale dic und das lokale self.dic zu ihrem Inhalt
kommen. Koennte es sein, dass du zuerst eine Instanz von getc
initialisierst, und danach dem globalen dic mit "dic = xxx"
einen neuen Wert zuordnest?

Grundsaetzlich scheint dein Verstaendnis von Klassen in Ordnung,
du musst nur aufpassen, wann du welche Instanz-Attribute zuweist.
So werden z.B. bei einem wiederholten Aufruf von getid() die
zusaetzlichen IDs weiterhin an die alte idlist angehaengt, du
kriegst also jedesmal ein kumuliertes Resultat. Das kann genau
das sein, was du haben willst, oder auch nicht... Wenn du jedes
mal eine frische idlist brauchst, dann muesstest du aufgrund der
rekursiven Struktur beim aufruf von getid() noch ein optionales
Initialisierungsflag einbauen.


-schorsch

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




More information about the Python-de mailing list