2012-04-08 26 views
2

我想实现一个代表有向图中节点的类Node,该节点特别具有一组后继和前辈。我想Node.predecessorsNode.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类属性),如果我有所有节点的只有一个图,但是如果我有多个不相交的图,那么对所有节点使用一个大的集会导致大的计算量,而我不知道如何修改前面的集。

有没有人有这个好的解决方案?

+0

为什么不是你的节点只需要存储在属性'predecessors'和'successors'一组实际? – Marcin 2012-04-08 14:50:45

+0

在任何情况下,如果没有代码或您的较大设计的细节,您将得不到多少帮助。 – Marcin 2012-04-08 14:53:06

+0

我希望类逻辑确保这些集合始终保持一致,这样我就不需要在'node_1.sucessors.add(node_2)'之后'node_1'显式地添加'node_2.pedecessors'。 – Anaphory 2012-04-08 14:54:40

回答

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)