用自定义模块替换模块的功能



我正在使用一个具有类A和函数foo的外部模块。该类调用其内部的函数

def foo(...):
...
class A:
def m(self, ...):
...
foo()
...
...

我需要在不编辑模块的情况下更改foo的行为。有没有一种巧妙的方法可以做到这一点,而不需要对类A进行子类化?

定义替换函数,然后将其分配给类函数。

def replacement_m(...):
...
from external_module import A
A.m = replacement_m

不幸的是,您不能仅仅替换foo(),因为它不是一个类方法。您必须替换整个A.m方法。

这被称为猴痘匹配。有关更多信息,请参阅此问题什么是猴子补丁?

最新更新