Преимущества использования MethodType в Python
каковы преимущества использования MethodType С types модуль? Вы можете использовать его для добавления методов к объекту. Но мы можем сделать это легко и без него:
def func():
print 1
class A:
pass
obj = A()
obj.func = func
он работает, даже если мы удалим func в основной области, работает del func.
почему нужно использовать MethodType? Это просто условность или хорошая привычка к программированию?
2 ответов
на самом деле разница между динамическим добавлением методов во время выполнения и ваш пример огромен:
- в вашем случае вы просто прикрепляете функцию к объекту, вы можете вызвать ее, конечно, но это unbound, он не имеет никакого отношения к самому объекту (т. е. вы не можете использовать
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>.
совместное использование types.MethodType проверяет, является ли какой-либо объект методом. Например:
>>> import types
>>> class A(object):
... def method(self):
... pass
...
>>> isinstance(A().method, types.MethodType)
True
>>> def nonmethod():
... pass
...
>>> isinstance(nonmethod, types.MethodType)
False
обратите внимание, что в вашем примере isinstance(obj.func, types.MethodType) возвращает False. Представьте, что вы определили метод meth в классе A. isinstance(obj.meth, types.MethodType) вернутся True.