猴子补丁向现有模块添加新的 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
如果我现有的模块 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