猴子修补 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 = ???

您可以使用其__get__特殊方法从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'>
>>>

Doh!

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

方法只有在从类(而不是从实例字典)接收时自动传递 self arg,因此您需要在那里传递一个 1-arg 函数:

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

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

最新更新