2015-01-24 2 views
3

Я пытаюсь обезвредить экземпляр класса, но не совсем понимаю, как я могу исправить метод класса без проблем.monkey-patching 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 = ??? 
+0

возможно ... Я действительно не понимаю, что происходит в этом коде. –

+0

- это мой вопрос «насмешливый» или «обезглавливание»? –

+0

Можете ли вы объяснить разницу, пожалуйста? – pss

ответ

6

Вы можете создать новый метод экземпляра из times_eight, используя его __get__ special method:.

>>> 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'> 
>>> 
+0

О, это круто. –

+1

Ваше решение также хорошо работает. Я просто показывал, как это сделать, не импортируя 'types.MethodType'. :) – iCodez

2

Doh!

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

Методы только получить self аргумента передается автоматически при получении от класса (не из экземпляра Словаря), так что вам нужно передать функцию 1-Arg там:

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

(можно упростить, что с functools.partial)

+0

Я думаю, что лучше добавить объект к закрытию 'lambda arg, s = s: time_eight (s, arg)' – pss

+2

Однако это не делает метод экземпляра. Правильно? Это лямбда или частичная, поэтому я не думаю, что это действительно работает. –

Смежные вопросы