给定一个有向networkx图。我想为从图中删除的每个节点调用一个函数,比如"abc()
"。我浏览了networkx文档,但没有发现任何这样的回调功能。
我认为:
- 向与节点关联的对象的
__del__()
(解构器)方法添加对abc()
的调用。然而,除了使用__del__()
的陷阱之外(例如,请参见此处),如果内存中存在指向节点对象的任何链接,那么这也不起作用 - 子类
networkx.DiGraph()
并重写remove_node()方法。缺点:这需要覆盖所有删除节点的方法,例如remove_nodes_from
(还有其他方法吗?) - 由于networkx图的实现是基于字典的,因此可以通过某种方式"挂接"该字典的
del
函数。不过,将这种深度干扰到networkx似乎是不合适的
实现每次删除networkx节点时调用的回调函数的最简单方法是什么?
在这种情况下,您只需要对两个方法进行子类化。下面是一个例子从networkx导入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()),但除非你有非常大的图,否则它可能不会很重要。如果您需要更好的性能,可以直接从这些方法复制代码,而不是调用超类。