我使用的是一个具有一个我需要定制的函数的Python库.

这不是问题,因为我可以制作自己的编辑版本,如下所示:

from coolLibrary import originalclass

class myclass(originalclass):
    whatever...

我现在面临的问题是,图书馆在多个地方使用这originalclass.有没有办法告诉图书馆在任何地方都使用myclass而不是originalclass

我的目标是在不编辑原始代码的情况下拥有一个定制代码,以便可以更新库.

推荐答案

如果coolLibrary.originalclass对其自身有明确的引用:

# coolLibrary.py
class originalclass:
    def foo(self):
        print('original foo')

    def bar(self):
        originalclass.foo(self)

以使:

# main.py
import coolLibrary

class myclass(coolLibrary.originalclass):
    def foo(self):
        print('custom foo')

myclass().bar()

输出:

original foo

在定义自定义类之后,您可以使用自定义类修补coolLibrary.originalclass:

coolLibrary.originalclass = myclass

因此:

myclass().bar()

然后输出:

custom foo

演示:https://replit.com/@blhsing1/JollyHumiliatingTabs

请注意,修补原始类会使行为发生全局更改.如果也使用coolLibrary.originalclass的另一个模块依赖于其原始行为才能工作,则您可能希望将补丁仅应用于需要此类自定义行为的代码块.这可以通过unittest.mock.patch上下文管理器来完成:

from unittest.mock import patch

with patch('coolLibrary.originalclass', myclass):
    myclass().bar()

Python相关问答推荐

替换为Pandas

Django:如何将一个模型的唯一实例创建为另一个模型中的字段

在IIS中运行的FastAPI-获取权限错误:[Win错误10013]试图以其访问权限禁止的方式访问插槽

无法获得指数曲线_fit来处理日期

将从Python接收的原始字节图像数据转换为C++ Qt QIcon以显示在QStandardProject中

Plotly:如何更改Heatmap中彩色条的勾选文本

code _tkinter. Tcl错误:窗口路径名称错误.!按钮4"

在Windows上启动新Python项目的正确步骤顺序

模型序列化器中未调用现场验证器

基本链合同的地址是如何计算的?

在Pandas框架中截短至固定数量的列

Class_weight参数不影响RandomForestClassifier不平衡数据集中的结果

使用plotnine和Python构建地块

比较两个数据帧并并排附加结果(获取性能警告)

替换字符串中的多个重叠子字符串

为什么我的Python代码在if-else声明中的行之前执行if-else声明中的行?

Pandas - groupby字符串字段并按时间范围 Select

部分视图的DataFrame

在单次扫描中创建列表

寻找Regex模式返回与我当前函数类似的结果