Python:猴子修补同一模块中的类使用的函数

问题描述 投票:0回答:1

我想修改模块中的函数(而不是方法),以便同一模块中使用该函数的类表现不同。

为了简单起见,假设我有一个名为

_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
,并且两者都位于同一个文件中。但我认为这与问题无关。

python python-module monkeypatching
1个回答
0
投票

您应该修补

_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()
© www.soinside.com 2019 - 2024. All rights reserved.