我想修补一些使用外部模块中的对象的代码。修补一个python对象以将缺省值添加到方法kwargs
这个对象的一个方法被称为遍布整个地方,我需要在所有这些调用中设置一个新的默认kwarg。
与其添加太多重复代码,我认为最好是更改对象方法。什么是最干净的方式来做到这一点?
我想修补一些使用外部模块中的对象的代码。修补一个python对象以将缺省值添加到方法kwargs
这个对象的一个方法被称为遍布整个地方,我需要在所有这些调用中设置一个新的默认kwarg。
与其添加太多重复代码,我认为最好是更改对象方法。什么是最干净的方式来做到这一点?
这叫做monkey-patching,它没有“干净”版本。
如果你需要在一个类Foo
更换方法bar
,使用此代码:
oldMethod = Foo.bar
def newMethod(self, **kwargs):
... fix kwargs as necessary ...
oldMethod(self, **kwargs)
Foo.bar = newMethod
self
,就好像这个函数在类中一样。oldMethod(self, ...)
。这将采用方法指针,并将该实例作为第一个参数进行调用。 self.oldMethod()
不起作用,因为我们不在class
上下文中(我认为)。相关:
我决定写一个包装类从我需要修改的对象继承。
class Wrapper(Target):
def method(self, *args, **kwargs):
kwargs['option'] = True
return super(Wrapper, self).method(*args, **kwargs)
instance = Target()
instance.__class__ = Wrapper
为什么不只是:'instance = Wrapper()'? – OozeMeister
在我的实际情况中,实例由来自不想编辑的外部模块的函数返回。尽管我对课程知之甚少,但很可能有更好的方法来做到这一点。 – so12311
'self.oldMethod'在哪里定义/设置? – martineau
作为一个装饰者,这不是很简单吗? – sapi
@sapi如果你能够修改源代码。但是,我怀疑这是OP在这里想要的,因为如果是这样的话,那么OP就会做到这一点。 – OozeMeister