Ich habe gelesen, dass es eher nicht ratsam ist, zu Versuchen, den Typ eines Objektes zu ändern. Deshalb möchte ich fragen, wie sich folgendes Szenario schön umsetzen lässt.
Es geht darum Baumstrukturen mittels Python zu traversieren und zu transformieren.
Ich würde am liebsten eine Klasse "TreeNode" anlegen, und von dieser Klasse mehrere Unterklassen bilden -- etwa "SimpleTreeNode" und "ForkingTreeNode". Allen TreeNodes ist gemein, dass sie eine Reihe von Nachfolgern/Branches habe.
Es soll für alle TreeNodeKlassen jeweils eine Methode Simplify() geschrieben werden.
Simplify arbeitet im wesentlichen rekursiv.
So soll beispielsweise ForkingTreeNode.Simplify() zunächst die Simplify()-Methode aller Branches aufrufen. Dadurch sollen die Branches des ForkingTreeNodes verändert werden. Im nächsten Schritt soll ForkingTreeNode.Simplify() unter bestimmten Bedingungen durch den ForkingTreeNode durch einen SimpleTreeNode ersetzen. Und da liegt das Problem!
Ein Aufruf der Form:
Code: Alles auswählen
def Simplify(self):
i = self.GetBestBranch()
self = self.branch[i]
Also dachte ich eigentlich als nächstes an folgendes:
Code: Alles auswählen
def Simplify(self):
i = self.GetBestBranch()
self.__class__ = self.branch[i].__class__
self.branches = self.branch[i].branches
Meine momentane Lösung sieht so aus, dass ich statt verschiedener Unterklassen von TreeNode nur noch die Klasse TreeNode verwende.
Jedes TreeNode-Objekt hat ein zusätzliches Attribut, welches den TreeNode-Typ ausdrückt.
Der Voreilt ist: Ich kann den "Typ" der TreeNodes dynamisch ändern:
Code: Alles auswählen
def Simplify(self):
...
i = self.GetBestBranch()
self.treenodetype = self.branch[i].treenodetype
self.branches = self.branch[i].branches
...
Code: Alles auswählen
def Simplify(self):
if self.treenodetyp == TreeNode.FORKING_NODE:
...
elif self.treenodetyp == TreeNode.SIMPLE_NODE:
...
else:
raise Exception("Simplify not implemented for" + self.treenodetyp)
Danke und gruß
barfoos