给定有向网络x图。我希望有一个函数,说" abc()
",调用从图中删除的每个节点。我浏览了networkx文档,但没有找到任何此类回调功能。
我考虑过:
abc()
的调用添加到与节点关联的对象的__del__()
(解构函数)方法。然而,除了使用__del__()
的缺陷(参见例如here)之外,如果节点对象的任何链接存在于内存中的某处,这将无效。networkx.DiGraph()
类进行子类化并重写remove_node()方法。缺点:这需要覆盖删除节点的所有方法,例如: remove_nodes_from
(还有吗?)del
功能。尽管如此,干扰网络x似乎是不合适的。实现每次删除networkx节点时调用的回调函数的最简单方法是什么?
答案 0 :(得分:1)
在这种情况下,您只需要子类化两个方法。这是一个例子 来自networkx import DiGraph
class RemoveNodeDiGraph(DiGraph):
def remove_node(self, n):
DiGraph.remove_node(self, n)
print("Remove node: %s"%n)
def remove_nodes_from(self, nodes):
for n in nodes:
self.remove_node(n)
if __name__=='__main__':
G = RemoveNodeDiGraph()
G.add_node('foo')
G.add_nodes_from('bar',weight=8)
G.remove_node('b')
G.remove_nodes_from('ar')
这不如DiGraph类中的原始方法(特别是remove_nodes_from())快,但除非你有非常大的图形,否则它不会很重要。如果您需要更好的性能,可以直接从这些方法复制代码,而不是调用超类。