我想修改模块中的函数(而不是方法),以便同一模块中使用该函数的类表现不同。
为了简单起见,假设我有一个名为
_module.py
的文件和一个位于名为 __init__.py
的目录中的文件 my_library
。
# file _module.py
def _do_something():
print('hello')
class foo():
def bar(self):
_do_something()
# file __init__.py
from ._module import foo
我尝试过猴子修补功能
_do_something
像这样
import my_library
my_library._do_something = lambda: print('goodbye')
a = my_library.foo()
a.bar()
但它仍然输出
hello
。我也尝试过以下
from my_library import foo, _do_something
_do_something = lambda: print('goodbye')
a = foo()
a.bar()
但它会抛出一个
cannot import name '_do_something' from 'my_library'
错误。
如何修改
_do_something
,以便在调用 foo.bar
时反映更改?
PS:其实我想更改
_estimate_gaussian_parameters
使用的函数sklearn.mixture.GaussianMixture
,并且两者都位于同一个文件中。但我认为这与问题无关。
您应该修补
_module
的功能,而不是my_library
中导入的功能:
import my_library
my_library._module._do_something = lambda: print('goodbye')
a = my_library.foo()
a.bar()
我还建议使用
unittest.mock
:
import my_library
from unittest.mock import patch
with patch.object(my_library._module, '_do_something', lambda: print('goodbye')):
a = my_library.foo()
a.bar()