6
猴子在Python的另一个模块中修补类
我正在使用其他人编写的模块。我想猴子修补__init__模块中定义的类的方法。我发现的示例显示了如何执行此操作的所有示例,都假设我自己将自己称为该类(例如Monkey-patch Python类)。然而,这种情况并非如此。在我的情况下,该类是在另一个模块的函数中初始化的。请参阅下面的(大大简化的)示例: 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() 有什么方法可以修改的__init__方法,例如,SomeClass当dosomething从mymodule.py调用该方法时,它显示43而不是42?理想情况下,我将能够包装现有方法。 我不能更改thirdpartymodule * .py文件,因为其他脚本取决于现有功能。我宁愿不必创建自己的模块副本,因为我需要进行的更改非常简单。 编辑2013-10-24 在上面的示例中,我忽略了一个很小但很重要的细节。SomeClass是这样导入的thirdpartymodule_b:from thirdpartymodule_a import SomeClass。 要执行FJ建议的补丁,我需要替换其中的副本thirdpartymodule_b,而不是thirdpartymodule_a。例如thirdpartymodule_b.SomeClass.__init__ = new_init。