monkey-patching python一个实例方法

时间:2015-01-24 16:52:57

标签: python

我正在尝试修补类实例,但是我不太清楚如何修补类方法没问题。

>>> class Simple(object): 
...     def make(self, arg):
...         return arg * 2
... 
>>> s = Simple()
>>> def times_four(self, arg):
...   return arg * 4
... 
>>> Simple.make = times_four
>>> s.make(10)
40

但是说我只想在实例中替换make,最简单的方法是什么?

>>> def times_eight(self, arg):
...   return arg * 8
>>> s.make = ???

3 个答案:

答案 0 :(得分:11)

您可以使用__get__ special method创建times_eight中的新实例方法:

>>> class Simple(object):
...     def make(self, arg):
...         return arg * 2
...
>>> s = Simple()
>>> def times_eight(self, arg):
...     return arg * 8
...
>>> s.make = times_eight.__get__(s, Simple)
>>> s.make(10)
80
>>> type(s.make)
<type 'instancemethod'>
>>>

答案 1 :(得分:5)

卫生署!

>>> import types
>>> s.make = types.MethodType(times_eight, s, Simple)
>>> s.make(10)
80

答案 2 :(得分:0)

方法仅从类(而不是实例dict)中获取自动传递的self arg,因此您需要在那里传递1-arg函数:

s.make = lambda arg: times_eight(s, arg)

(您可以使用functools.partial简化它。)