【发布时间】:2013-11-01 23:35:16
【问题描述】:
我正在使用其他人编写的模块。我想修补模块中定义的类的__init__ 方法。我发现的展示如何做到这一点的例子都假设我自己会调用这个类(例如Monkey-patch Python class)。然而,这种情况并非如此。在我的情况下,该类是在另一个模块的函数中初始化的。请参阅下面的(非常简化的)示例:
thirdpartymodule_a.py
class SomeClass(object):
def __init__(self):
self.a = 42
def show(self):
print self.a
thirdpartymodule_b.py
import thirdpartymodule_a
def dosomething():
sc = thirdpartymodule_a.SomeClass()
sc.show()
mymodule.py
import thirdpartymodule_b
thirdpartymodule_b.dosomething()
有什么方法可以修改SomeClass 的__init__ 方法,以便在从mymodule.py 调用dosomething 时,例如打印43 而不是42?理想情况下,我可以包装现有的方法。
我无法更改thirdpartymodule*.py 文件,因为其他脚本依赖于现有功能。我宁愿不必创建自己的模块副本,因为我需要进行的更改非常简单。
编辑 2013-10-24
在上面的示例中,我忽略了一个小而重要的细节。 SomeClass 由 thirdpartymodule_b 导入,如下所示:from thirdpartymodule_a import SomeClass。
要执行 F.J 建议的补丁,我需要替换 thirdpartymodule_b 中的副本,而不是 thirdpartymodule_a。例如thirdpartymodule_b.SomeClass.__init__ = new_init.
【问题讨论】:
-
我不明白为什么你从哪里调用课程会有所不同。
-
文件名应该是
thirdpartymodule_a.py,thirdpartymodule_b.py。
标签: python class unit-testing monkeypatching