我正在尝试猴子修补类实例,但不太明白如何修补类方法没有问题。
>>> 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
简化它。