monkey-patching python一个实例方法

7 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
Run Code Online (Sandbox Code Playgroud)

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

>>> def times_eight(self, arg):
...   return arg * 8
>>> s.make = ???
Run Code Online (Sandbox Code Playgroud)

iCo*_*dez 13

您可以times_eight使用其__get__特殊方法创建一个新的实例方法:

>>> 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'>
>>>
Run Code Online (Sandbox Code Playgroud)

  • 在 `times_eight()` 中使用 `super()` 有效吗? (3认同)
  • 您的解决方案也效果很好。我只是展示了如何在不导入“types.MethodType”的情况下执行此操作。:) (2认同)

Kos*_*Kos 6

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

s.make = lambda arg: times_eight(s, arg)
Run Code Online (Sandbox Code Playgroud)

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

  • 然而,这并不是真正创建实例方法。正确的?它是 lambda 或部分,所以我认为这实际上不起作用。 (3认同)

小智 5

卫生署!

>>> import types
>>> s.make = types.MethodType(times_eight, s, Simple)
>>> s.make(10)
80
Run Code Online (Sandbox Code Playgroud)