我想实现一个代表有向图中节点的类Node
,该节点特别具有一组后继和前辈。我想Node.predecessors
和Node.predecessors
表现得像集,特别是我想迭代他们的元素,添加和删除元素,检查包含,并从可迭代设置它们。但node_1.sucessors.add(node_2)
之后应该是这样,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)
应该是可能的一个,但后来我需要跟踪属于一个图,这是很容易(将其添加到__init__
一个weakref.WeakSet
类属性),如果我有所有节点的只有一个图,但是如果我有多个不相交的图,那么对所有节点使用一个大的集会导致大的计算量,而我不知道如何修改前面的集。
有没有人有这个好的解决方案?
为什么不是你的节点只需要存储在属性'predecessors'和'successors'一组实际? – Marcin 2012-04-08 14:50:45
在任何情况下,如果没有代码或您的较大设计的细节,您将得不到多少帮助。 – Marcin 2012-04-08 14:53:06
我希望类逻辑确保这些集合始终保持一致,这样我就不需要在'node_1.sucessors.add(node_2)'之后'node_1'显式地添加'node_2.pedecessors'。 – Anaphory 2012-04-08 14:54:40