如何覆盖python库的函数?

问题描述:

我正在使用一个python库,我需要重写其中一个函数。让我们把这种 module.py如何覆盖python库的函数?

def dump(nodes, args = 'bleh'): 
    ...validation checks 
    for node in nodes: 
    print(node, someother_args) 

def print_node(node, someother_args): 
    ...prints in some way i don't want 

现在,我使用这个转储方式,我想用我自己的方法print_node覆盖print_node功能,因为我要打印以不同的方式。什么是最好的方式来做到这一点?

+0

注意,你已经与python2.7这个标记,并在2.7打印不是一个函数。你可以从你的文件的顶部导入print_function以改变它(它在python3中被改变为一个函数,部分出于这个原因) –

+0

这是可行的,但几乎总是一个坏主意。 – user2357112

+0

@ user2357112标题中的问题是一个糟糕的主意,但巴黎事实上试图做的不是IMO。覆盖默认函数可能会导致可维护性问题,但是想要自定义打印函数并不坏 - 我只是将它命名为不同的东西,例如,打印和写入日志的print_and_log可能非常有用 –

您可以自行创建一个继承自预期模块的类,并以任何您想要的方式覆盖该函数。然后你可以使用你的对象而不是module.py

class my_class(module): 
    def __init__(self, *args, **kwargs): 
     super(my_class, self).__init__(*args, **kwargs) 
    def dump(self): 
     # do stuff 

正如您在评论中提到的,如果您的模块包含一堆函数,您最好在当前模块中定义新函数。然后,您可以将其分配给该功能名称。

由于@Joran比斯利也提到了,你可以这样做以下

import my_file 
my_file.dump = my_local_dump_fn 
+0

该模块没有类。这只是一堆功能。 –

+0

在这种情况下,您可以不在当前模块中定义新功能。然后,您可以将其分配给该功能名称。 – Kasramvd

+1

'import my_file'; 'my_file.dump = my_local_dump_fn'在你完成这个操作后导入这个方法的任何地方都应该得到你的重载函数... –