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

时间:2015-05-29 12:08:21

标签: python package override python-import

如果我导入了一个包,请说“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调用其他方法来调用我的覆盖函数

1 个答案:

答案 0 :(得分:1)

这是如何在python中调用方法的问题。您正在修补draw_networkx_nodes顶级模块中的networkx,但它并非来自该顶层模块: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
相关问题