覆盖包方法,当该方法在包内部导入时
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
如果我导入一个包,假设是 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