Python: добавить метод к существующему инстансу класса

Автор: | 02/06/2016
 

PythonПредположим — у нас имеется класс:

>>> class AClass():
...   def a_method(self):
...     print("A method")

И отдельный метод:

>>> def standalone_function(self):
...   print("Standalone function")

Создаем инстанс класса:

>>> aclass_instance = AClass()
>>> aclass_instance.a_method()
A method

Первым решением было следующее:

>>> aclass_instance.b_method = standalone_function
>>> aclass_instance.b_method(aclass_instance)
Standalone function

Что в корне неверно, так как в данном случае просто создается ссылка aclass_instance.b_method на объект standalone_function:

>>> id(standalone_function)
4396555272
>>> id(aclass_instance.b_method)
4396555272

Либо — сравним типы:

>>> type(aclass_instance.a_method)
<type 'instancemethod'>
>>> type(aclass_instance.b_method)
<type 'function'>

Более правильное решение — использовать types.MethodType():

>>> import types
>>> aclass_instance.b_method = types.MethodType(standalone_function, aclass_instance, AClass)
>>> aclass_instance.b_method()
Standalone function
>>> id(aclass_instance.a_method)
4396425296
>>> id(aclass_instance.b_method)
4395895616
>>> type(aclass_instance.a_method)
<type 'instancemethod'>
>>> type(aclass_instance.b_method)
<type 'instancemethod'>