我想修补一些使用外部模块中对象的代码。
这个对象的一个方法遍布整个地方,我需要在所有这些调用中设置一个新的默认kwarg。
我认为改变对象方法会更好,而不是添加如此多的重复代码。最干净的方法是什么?
答案 0 :(得分:3)
这称为monkey-patching,并且没有“干净”版本。
如果您需要替换类bar
中的方法Foo
,请使用以下代码:
oldMethod = Foo.bar
def newMethod(self, **kwargs):
... fix kwargs as necessary ...
oldMethod(self, **kwargs)
Foo.bar = newMethod
self
,就像这个函数在类中一样。oldMethod(self, ...)
。这将采用方法指针,并以实例作为第一个参数调用它。 self.oldMethod()
不起作用,因为我们不在class
背景下(我认为)。相关:
答案 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