【问题标题】:best way to represent a bidirectional traversable hierarchy表示双向可遍历层次结构的最佳方法
【发布时间】:2012-08-16 00:52:04
【问题描述】:

我需要将一些数据表示为一个对象可以有一个父级和多个子级的层次结构。我还需要能够像获得孩子一样获得孩子的父母。

我试过了

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

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

有没有解决这个问题的通用方法

【问题讨论】:

    标签: python parent parent-child hierarchy


    【解决方案1】:

    我认为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 属性知道他们的父母。

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

    当然,你可以通过给Node 对象赋予children 属性来让事情变得更有趣——然后Nodes 可以成为更多Nodes 的父级。整洁。

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

    【讨论】:

    • 我也会这样做。如果您在递归子例程中以编程方式遍历树,则循环引用可能会成为问题,但有一些方法可以解决这个问题(路径跟踪是这种事情的蛮力选项)。然而,能够回顾树的一个优点是能够拥有一个 child.path() 方法,该方法返回从根到该节点的路径。
    • 此外,您可以在没有 Root 对象的情况下执行此操作。如果你只使用 Node 对象并为你的根 Node 对象的 parent 参数传入 None ,那应该可以达到相同的效果。
    • @Adrian -- 是的。我只保留了一个 Root 对象,因为 OP 做到了。但你是对的,如果 Node 同时具有 childrenparent 属性,则不需要 Root 对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多