2015-05-29 44 views
2

如果我導入包,比方說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) 

我想方法平局調用其他方法,將調用我的被覆蓋的功能

+1

[XY問題】(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? –

+3

你的意思是'將networkx導入爲nx'嗎? – chepner

+0

是的,我的錯誤。 – DavidK

回答

1

這是方法的調用方式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 
+0

您認爲OP覆蓋'nx.draw_networkx_nodes'是否是覆蓋錯誤的基本函數? – smci

+0

yupp,對不起,我還在編輯答案。希望現在更清楚 –

+0

因此,道德是「你必須不僅修補功能本身,而且修補所有內部輸入別名到該功能」*? – smci