我正在尝试修补类实例,但是我不太清楚如何修补类方法没问题。
>>> 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 = ???
答案 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
简化它。)