Преимущества использования 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
.