Динамически добавлять функцию-член к экземпляру класса в 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 интерпретировать исходный пример таким образом? Другими словами, есть ли способ добавить функцию-член к экземпляру класса во время выполнения?
Спасибо
Ответы
Ответ 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
, но функция, помещенная внутри объекта, является просто функцией.