На самом деле разница между методами добавления динамически во время выполнения и ваш пример огромен:
- в вашем случае, вы просто прикрепить функцию к объекту, вы можете назвать это, конечно, но это несвязанного, это не имеет никакого отношения к самому объекту (то есть. вы не можете использовать
self
внутри функцию)
- при добавлении с
MethodType
, нужно создать метод связанного и он ведет себя как обычный метод Python для объекта, вы должны принять объект он принадлежит в качестве первого аргумента (обычно он называется self
), и вы можете получить доступ к нему внутри функции
Этот пример показывает разницу:
def func(obj):
print 'I am called from', obj
class A:
pass
a=A()
a.func=func
a.func()
Это терпит неудачу с TypeError
: func() takes exactly 1 argument (0 given)
, в то время как этот код работает, как ожидалось:
import types
a.func = types.MethodType(func, a, A)
a.func()
шоу I am called from <__main__.A instance at xxx>
.
На самом деле это не добавление метода к 'obj'. 'obj.func()' такой же, как вызов только 'func()'. Метод получает экземпляр как 1. позиционный аргумент. Вы можете создать связанный метод с 'func .__ get __ (obj, A)', но это тоже не сработает, так как 'func' не принимает аргументов. –
Ваша функция 'func' не имеет аргумента' self'. Вы используете 'type', если хотите присоединить или заменить метод * класса. Здесь вы просто присоединяете * функцию * к классу. – Cyrbil