Darii hat geschrieben:Wie du gerade selbst schön ausgeführt hast hätte neighbours in Node nichts zu suchen, weil eine hypotetische Subklasse BinaryTreeNode damit rein gar nichts anfangen könnte (außer eine readonly-Property draus zu machen dann bricht man aber mit dem obj.neighbours.append-Interface das vorher funktionierte).
Mit dem bisherigen add_neighbour geht das doch auch nicht!
Hab ich das behauptet? Du willst doch neighbours vererben lassen. Das würde ein vorhandenes Interface brechen. add_neighbours hat da selbstverständlich genauso wenig was zu suchen.
Auf der einen Seite forderst Du Kapselungen fürs Setzen und Abfragen von Nachbarn, auf der anderen Seite stellst Du dann die Generalisierung dafür selber in Frage
Lies mal aufmerksam meine Posts, ich fordere nur eine Generalisierung für das Abfragen. Für das Setzten macht das wenig Sinn, was aber nichts daran ändert, dass das direkte Manipulieren einer evtl. vorhandenen neighbours-Liste eine schlechte Idee ist. Wenn man dann nämlich irgendwann noch Logik hinzufügen will oder die Art der Datenspeicherung ändern will hat man ein Problem.
Vielleicht mal zur Illustration:
Code: Alles auswählen
class TreeNode(object):
def __init__(self, payload):
self.payload = payload
def expand(self):
raise NotImplementedError
def __repr__(self):
return str(self)
def __str__(self):
return "<%s %s -> %s>" % (type(self).__name__, self.payload, self.expand())
class GenericTreeNode(TreeNode):
def __init__(self, payload, children=None):
TreeNode.__init__(self, payload)
self._children = children[:] if children else []
def expand(self):
return self._children
def add_child(self, child):
self._children.append(child)
class BinaryTreeNode(TreeNode):
def __init__(self, payload, left=None, right=None):
TreeNode.__init__(self, payload)
self.left = left
self.right = right
def expand(self):
return filter(bool, [self.left, self.right])
def search_tree(node, payload):
for node in node.expand():
if node.payload == payload:
return node
else:
return search_tree(node, payload)
tree = GenericTreeNode(2, [GenericTreeNode(4), GenericTreeNode(7)])
tree2 = BinaryTreeNode(2, BinaryTreeNode(4), BinaryTreeNode(7))
print search_tree(tree, 4)
print search_tree(tree2, 4)
search_tree funktioniert in beiden Fällen.