在Python

时间:2016-05-26 08:26:15

标签: python oop methods monkeypatching

使用MethodType模块中的types有什么好处?您可以使用它向对象添加方法。但是如果没有它我们可以很容易地做到这一点:

def func():
   print 1

class A:
   pass

obj = A()
obj.func = func

即使我们通过运行func删除主范围中的del func,它仍然有效。

为什么要使用MethodType?它只是一种惯例还是一种良好的编程习惯?

2 个答案:

答案 0 :(得分:13)

实际上在运行时和动态添加方法之间的区别 你的榜样很大:

  • 在你的情况下,你只是将一个函数附加到一个对象,你当然可以调用它,但它是 unbound ,它与对象本身无关(即你不能使用{{ 1}}在函数内部)
  • 添加self时,您创建一个绑定方法,它的行为类似于对象的普通Python方法,您必须获取对象属于第一个参数(通常称为MethodType),您可以在函数
  • 中访问它

此示例显示了差异:

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()

答案 1 :(得分:4)

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中定义了方法Aisinstance(obj.meth, types.MethodType)会返回True