2012-08-16 83 views
0

我需要将某些数据表示为层次结构,其中的对象可以有一个父项和多个子项。我也需要能够像孩子那样得到一个孩子的父母。表示双向遍历层次结构的最佳方式

我想这

class Root(): 
    def __init__(self): 
     self.child = Node(self) 

class Node(): 
    def __init__(self, parent): 
     self.parent = parent 

是否有解决这一问题在那里

回答

7

我认为这基本上是如何Tkinter做它的常见方式:现在

class Root(object): 
    def __init__(self): 
     self.children = [] 

class Node(object): 
    def __init__(self,parent): 
     self.parent = parent 
     parent.children.append(self) 

Root通过children属性知道所有的孩子,孩子们通过parent attri知道他们的父母弼。

r = Root() 
n = Node(r) 
r.children[0] is n #True 
n.parent is r #True 

当然,你可以让事情变得更有趣通过给Node对象一个children属性,以及 - 然后Node S能够更父Node秒。整齐。

这里有一些缺点(主要是循环引用)。如果你想避免这种情况,你可以使用weakref.ref来存储对孩子/父母的引用,但如果有必要,我会推迟到另一个问题。

+0

我也是这么做的。循环引用可能是一个问题,如果你在递归子程序中以编程方式遍历树,但是有一些方法可以解决这个问题(路径追踪是这种事情的强力选择)。但是,能够回看树的一个好处是能够拥有一个返回从根节点到该节点的路径的child.path()方法。 – Adrian 2012-08-16 01:09:22

+0

另外,您可以在没有Root对象的情况下执行此操作。如果您只是使用Node对象,并将None传递给根节点对象的父参数,则应该达到相同的效果。 – Adrian 2012-08-16 01:15:36

+0

@Adrian - 是的。我只保留了一个'Root'对象,因为OP有。但是你是对的,如果'Node'同时具有'children'和'parent'属性,'Root'对象是不必要的。 – mgilson 2012-08-16 01:16:55