2

我正在尝试实现一个Node表示有向图中的节点的类,该类特别具有一组后继和前驱。我想Node.predecessors并且Node.predecessors表现得像集合,特别是我想迭代它们的元素,添加和删除元素,检查包含,并从可迭代中设置它们。但是,在node_1.sucessors.add(node_2)它应该是 True之后node_1 in node_2.pedecessors

似乎可以编写一个新的子类set来实现这个魔法,但据我所知,这样一个类的实现会非常麻烦,因为它必须知道Node它所属的对象以及它是前任还是继任者,并且需要一些特殊的方法进行加法等,这样node_1.sucessors.add(node_2)就不会调用node_2.predecessors.add(node_1),从而导致无限循环。

动态生成两个属性之一(node for node in all_nodes if self in node.sucessors)应该是可能的,但是我需要跟踪属于一个图的所有节点,如果我只有一个图但使用一个图,这很容易(将其添加到weakref.WeakSet类属性中)__init__如果我有多个不相交的图,所有节点的大集合会导致大量计算工作,而且我看不到如何修改前辈集合。

有人对此有很好的解决方案吗?

4

1 回答 1

5

如果您将 add 方法包装在您的类中,然后在该包装方法中,您只需使用前任和后继两个属性。像这样的东西

这是我想到的第一个解决方案:

class Node:

    def __init__(self):
        self.pred = set()
        self.suce = set()

    def addSucessor(self, node):
        self.suce.add(node)
        node.pred.add(self)
于 2012-04-08T14:57:32.607 回答