2015-01-05 22 views
4

我想修补一些使用外部模块中的对象的代码。修补一个python对象以将缺省值添加到方法kwargs

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

与其添加太多重复代码,我认为最好是更改对象方​​法。什么是最干净的方式来做到这一点?

回答

3

这叫做monkey-patching,它没有“干净”版本。

如果你需要在一个类Foo更换方法bar,使用此代码:

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. 最后,我们在类中安装修补方法。

相关:

+0

'self.oldMethod'在哪里定义/设置? – martineau

+0

作为一个装饰者,这不是很简单吗? – sapi

+0

@sapi如果你能够修改源代码。但是,我怀疑这是OP在这里想要的,因为如果是这样的话,那么OP就会做到这一点。 – OozeMeister

0

我决定写一个包装类从我需要修改的对象继承。

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

instance = Target() 
instance.__class__ = Wrapper 
+0

为什么不只是:'instance = Wrapper()'? – OozeMeister

+0

在我的实际情况中,实例由来自不想编辑的外部模块的函数返回。尽管我对课程知之甚少,但很可能有更好的方法来做到这一点。 – so12311

相关问题