使用MethodType
模块中的types
有什么好处?您可以使用它向对象添加方法。但是如果没有它我们可以很容易地做到这一点:
def func():
print 1
class A:
pass
obj = A()
obj.func = func
即使我们通过运行func
删除主范围中的del func
,它仍然有效。
为什么要使用MethodType
?它只是一种惯例还是一种良好的编程习惯?
答案 0 :(得分:13)
实际上在运行时和动态添加方法之间的区别 你的榜样很大:
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
中定义了方法A
。 isinstance(obj.meth, types.MethodType)
会返回True
。