猴子补丁向现有模块添加新的 class 和功能

monkey patch add new class and functions to existing module

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

class A:
   variable_b = "some text"

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

class A:
   variable_b = "some text"

class B:
   variable_c = "more text"

def some_func():
   pass

我想你是说 track.py 是不可访问的(可能来自你不想接触的图书馆)。

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

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__)

此外,按照制作装饰器或某种包装来为您做的,如果您可以添加外部依赖项,那么看起来有人已经这样做了(我自己从未使用过,只是一个快 google)。 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