我正在尝试实现一个表示有向图中节点的类Node
,该节点特别具有一组后继和前导。我希望Node.predecessors
和Node.predecessors
表现得像集合,特别是我想迭代它们的元素,添加和删除元素,检查包含,并从迭代中设置它们。但是,在node_1.sucessors.add(node_2)
之后,node_1 in node_2.pedecessors
。
似乎有可能编写一个新的set
子类来实现这个魔法,但据我所知,这样一个类的实现会非常麻烦,因为它必须知道{{1它所属的对象,如果它是前任或后继者,并且需要一些特殊的方法来添加等等,那么Node
将不会调用node_1.sucessors.add(node_2)
,从而导致无限循环。 / p>
应该可以动态生成两个属性中的一个node_2.predecessors.add(node_1)
,但是我需要跟踪属于图形的所有节点,这很容易(将其添加到(node for node in all_nodes if self in node.sucessors)
类weakref.WeakSet
中的属性如果我只有一个图形,但是如果我有多个不相交的图形,那么对所有节点使用一个大集会导致大量的计算工作,而我看不到如何修改前一组图。
有人为此提供了很好的解决方案吗?
答案 0 :(得分: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)