Подтвердить что ты не робот

Динамически добавлять функцию-член к экземпляру класса в Python

Когда я делаю следующее:

class C:
 pass

def f( self ):
 print self

a = C()

a.f = f

a.f()

Я получаю следующую ошибку в строке a.f(): TypeError: f() принимает ровно 1 аргумент (задано 0)

Проблема заключается в том, что когда f добавляется в экземпляр, a, он рассматривается как функция, которая хранится внутри a, а не действительная функция-член. Если я изменяю a.f() на a.f(a), тогда я получаю предполагаемый эффект, но есть ли способ сделать python интерпретировать исходный пример таким образом? Другими словами, есть ли способ добавить функцию-член к экземпляру класса во время выполнения?

Спасибо

4b9b3361

Ответ 1

Для Python 2.X вы можете использовать:

import types
class C:
    pass

def f(self):
    print self

a = C()
a.f = types.MethodType(f,a)
a.f()

Для Python 3.X:

import types
class C(object):
    pass

def f(self):
    print(self)

a = C()
a.f = types.MethodType(f,a)
a.f()

Ответ 2

Вы должны поместить f в класс, а не в экземпляр...

 class C:
     pass

 def f(self):
    print(self)

 a = C()
 C.f = f
 a.f()

Для интерпретатора myObject.foo() это то же самое, что и myClass.foo(myObject), когда объект не содержит ничего с именем foo, но функция, помещенная внутри объекта, является просто функцией.