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)
方法仅self在从类(而不是从实例字典)接收时自动传递 arg,因此您需要在那里传递 1-arg 函数:
s.make = lambda arg: times_eight(s, arg)
Run Code Online (Sandbox Code Playgroud)
(您可以使用 来简化functools.partial。)
小智 5
卫生署!
>>> import types
>>> s.make = types.MethodType(times_eight, s, Simple)
>>> s.make(10)
80
Run Code Online (Sandbox Code Playgroud)