修补python对象以将默认值添加到方法kwargs

so1*_*311 5 python

我想修补一些使用来自外部模块的对象的代码。

该对象的一种方法在各处都被调用,我需要在所有这些调用中设置一个新的默认kwarg。

与其添加太多重复的代码,不如更改对象方​​法会更好。什么是最干净的方法?

Aar*_*lla 3

这称为猴子修补,并且没有“干净”的版本。

如果需要替换bar类中的方法Foo,请使用以下代码:

oldMethod = Foo.bar
def newMethod(self, **kwargs):
    ... fix kwargs as necessary ...
    oldMethod(self, **kwargs)
Foo.bar = newMethod
Run Code Online (Sandbox Code Playgroud)
  1. 首先,我们将旧方法句柄保存在变量中
  2. 然后我们将新方法定义为函数。第一个参数必须是self,就像该函数位于类内部一样。
  3. 为了调用原始方法,我们使用oldMethod(self, ...). 这将获取方法指针,并使用实例作为第一个参数来调用它。self.oldMethod()不起作用,因为我们不在class上下文中(我认为)。
  4. 最后,我们在类中安装修补后的方法。

有关的: