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

时间:2015-01-05 16:49:48

标签: python

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

这个对象的一个​​方法遍布整个地方,我需要在所有这些调用中设置一个新的默认kwarg。

我认为改变对象方法会更好,而不是添加如此多的重复代码。最干净的方法是什么?

2 个答案:

答案 0 :(得分:3)

这称为monkey-patching,并且没有“干净”版本。

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

oldMethod = Foo.bar
def newMethod(self, **kwargs):
    ... fix kwargs as necessary ...
    oldMethod(self, **kwargs)
Foo.bar = newMethod
  1. 首先,我们将旧方法句柄保存在变量
  2. 然后我们将新方法定义为函数。第一个参数必须是self,就像这个函数在类中一样。
  3. 要调用原始方法,我们使用oldMethod(self, ...)。这将采用方法指针,并以实例作为第一个参数调用它。 self.oldMethod()不起作用,因为我们不在class背景下(我认为)。
  4. 最后,我们在课堂上安装补丁方法。
  5. 相关:

答案 1 :(得分:0)

我决定编写一个包装类,它继承自我需要修改的对象。

class Wrapper(Target):
    def method(self, *args, **kwargs):
        kwargs['option'] = True
        return super(Wrapper, self).method(*args, **kwargs)

instance = Target()
instance.__class__ = Wrapper