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