Предположим – у нас имеется класс:
>>> 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'>