【问题标题】:monkey patch add new class and functions to existing module猴子补丁向现有模块添加新类和功能
【发布时间】:2021-08-03 14:11:07
【问题描述】:

如果我有一个现有的模块 track.py,看起来像:

class A:
   variable_b = "some text"

如何修补 track.py 以添加新类和新函数,例如:

class A:
   variable_b = "some text"

class B:
   variable_c = "more text"

def some_func():
   pass

【问题讨论】:

    标签: python monkeypatching


    【解决方案1】:

    我认为您是在说 track.py 无法访问(可能来自您不想触摸的库)。

    有几种方法可以做到这一点。一种是只导入模块,然后在运行时更改对象以包含该类。

    import track
    track.B = B  # or setattr(track, 'B', B)
    track.some_func = some_func  # or settattr(track, 'some_func', some_func)
    

    你也可以合并到 __init__.py 例如

    import track
    import track_monkey_patch
    track.__dict__.update(track_monkey_patch.__dict__)
    

    此外,按照为您制作装饰器或某种包装的方式,如果您可以添加外部依赖项,那么看起来有人已经这样做了(我自己从未使用过,只是一个快速的谷歌)。 https://github.com/christophercrouzet/gorilla

    任何人都可以使用的测试代码

    import collections  # could have been anything just came to my head quickly
    def foo():
        print("foooooo")
    collections.foo = foo
    collections.foo()
    >>> foooooo
    

    【讨论】:

    • 当试图修补'B'时,它只是说:模块'track'没有属性'B'
    • @user3831011 这很奇怪。你使用的是什么版本的 Python?我想你可以试试 setattr 但它是一样的。
    • 我在 3.8 上,setattr 做同样的事情
    • 您的文件夹结构如何?还是这是通过 pip 安装的模块?
    • 啊,我认为问题可能是该库中的另一个模块试图在它被修补之前调用它。认为这是一个自我引起的问题类型
    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2011-02-20
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多