覆盖包方法,当该方法在包内部导入时

Override a package method, when that method is internally imported within the package

如果我导入一个包,假设是 networkx。

如何覆盖其中的一个方法,使其成为包内所有其他函数调用的方法?

示例:

import networkx as nx

def _draw_networkx_nodes(G, pos,
                        nodelist=None,
                        node_size=300,
                        node_color='r',
                        node_shape='o',
                        alpha=1.0,
                        cmap=None,
                        vmin=None,
                        vmax=None,
                        ax=None,
                        linewidths=None,
                        label=None,
                        **kwds):
     print 'OK'

nx.draw_networkx_nodes = _draw_networkx_nodes

G = nx.Graph()
G.add_edge('A','B')
nx.draw(G)

我希望 draw 方法调用其他将调用我的覆盖函数的方法

这是python中方法调用的问题。您正在修补 networkx 顶级模块中的 draw_networkx_nodes,但它并非源自该顶级模块:networkx.draw 方法是从 networkx.drawing.nx_pylab 导入的。这个 draw 方法在本地调用 draw_networkx,它在本地(仍在该文件中)调用 draw_networkx_nodes。这就是为什么修改在 networkx/__init__.py 中导入的别名不起作用的原因:它从不在内部调用。

所以在其他方面:如果你想修补一个库的方法,看看它来自哪个子模块并在那里修补它。

所以在这种情况下:

In [6]: nx.drawing.nx_pylab.draw_networkx_nodes = _draw_networkx_nodes

In [7]: nx.draw(G)
OK