我的问题类似于question
除了在dosomething()
中执行thirdpartymodule_b
不是我的模块,所以我需要修补补丁thirdpartymodule_a
并在thirdpartymodule_b
答案 0 :(得分:1)
我认为您引用的问题与您的情况没有任何区别。在这两种情况下,模块都会从另一个模块导入名称,并且您希望修补该名称引用的对象。
在该问题中,该模块由作者撰写,在您的问题中,它是第三方模块。
我认为您的问题在于第三方已经导入了对象名称,因此如果您尝试替换它所在的模块中的对象,第三方模块仍将使用旧对象,因为它仍然引用旧对象。
module_1.py
class AForm(Form):
...
module_2.py
from module_1 import AForm
如果您导入module_2
然后使用另一个对象module_1
替换AForm
class AFormPatched(Form):
...
import module_1
module_1.AForm = AFormPatched
您的更改不会影响module_2
,因为module_2.AForm
仍然指向原始对象。
解决这个问题:
选项1。 module_2
应如下所示:
import module_1
module_1.AForm # using AForm in this form
选项2。修补程序module_2.AForm
:
class AFormPatched(Form):
...
import module_1
module_1.AForm = AFormPatched
import module_2
module_2.AForm = AFormPatched
或者不要仅module_1
修补module_2
来修补已修补的版本。
选项3。对象的修补程序属性。如果您不希望或不能修补使用对象名称的所有位置,有时如果您不替换该对象,但仅修补其某些属性,则有效。这取决于您尝试修补的对象和行为:
import third_party_module
third_party_module.AForm.__init__ = ...