python - python Monkey 修补一个新类并导入它
问题描述
我想修补一个新类,然后导入该类,但出现错误 ModuleNotFoundError。同时我可以使用新的补丁功能。我相信我想念如何将它添加到“ init ”文件中。
请参阅以下简化示例:
import numpy
class wrong_functions():
def wrong_add(num1, num2):
return num1 + num2 + 1
numpy.random.wrong_functions = wrong_functions
numpy.random.wrong_functions.wrong_add(1,1) # works
from numpy.random.wrong_functions import wrong_add # does not work
from numpy.random.wrong_functions import * # does not work
你怎么看?那可能吗?
解决方案
这是因为导入系统。
通读文档,您可以找到以下段落:
[...] 该声明
from spam.ham import eggs, sausage as saus
导致_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0) eggs = _temp.eggs saus = _temp.sausage
问题是:做什么__import__()
?
该
import
语句结合了两个操作;它搜索命名模块,然后将搜索结果绑定到本地范围内的名称。[...]直接调用
__import__()
仅执行模块搜索,如果找到,则执行模块创建操作。
因此,当您重新导入模块时,您的自定义将丢失。
为了确保它保持打开状态,您可以import numpy as np
然后在使用时np
- 在您评估这个新类之后 - 您始终可以访问wrong_add
.
>>> import numpy as np
>>> np.random.wrong_functions = wrong_functions
>>> np.random.wrong_function.wrong_add(1, 1)
3
编辑:如果您需要/只想调用wrong_add
而不是完整的包路径来调用函数,您可以随时将其分配给变量。
>>> wrong_add = np.random.wrong_function.wrong_add
>>> wrong_add(2, 2)
5
推荐阅读
- ios - 就 iOS 应用更新的可用性向用户提供建议
- javascript - 如果条件,如何在javaScript中组合多个“等于”?
- android - 如何配置 Android Studio 4.1.1 以使用过时的 Gradle 项目?
- html - 使用 CSS 将表格向右移动
- c++ - 如何调用仅参数化的类的复制构造函数
- python - 如何绘制带有 datetime.datetime 值的数据框列的图表
- javascript - 在元素的第二次、第三次等点击时播放不同的声音
- html - 使用引导程序 4 在 flex-fill 中垂直和水平居中 div
- python - Boost::Python 包装器在使用不同的线程时不再起作用
- sql - 如何在 SSMS 中成功运行递归触发器