在Python中使用MethodType的优点

在Python中使用MethodType的优点,python,oop,methods,monkeypatching,Python,Oop,Methods,Monkeypatching,使用types模块中的MethodType有什么好处?您可以使用它向对象添加方法。但如果没有它,我们可以轻松做到这一点: def func(): print 1 class A: pass obj = A() obj.func = func 即使我们通过运行del func删除主作用域中的func,它也可以工作 为什么要使用MethodType?这只是一种惯例还是一种好的编程习惯?类型的一种常见用法。MethodType检查某个对象是否是方法。例如: >>>

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

def func():
   print 1

class A:
   pass

obj = A()
obj.func = func
即使我们通过运行
del func
删除主作用域中的
func
,它也可以工作


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

类型的一种常见用法。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
。假设您在类
a
中定义了一个方法
meth
isinstance(obj.meth,types.MethodType)
将返回
True

事实上,在运行时动态添加方法和 你的例子是巨大的:

  • 在您的情况下,您只需将一个函数附加到一个对象上,您当然可以调用它,但它是未绑定的,它与对象本身没有关系(即,您不能在函数内部使用
    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()只接受一个参数(给定0)
, 鉴于本规范按预期工作:

import types
a.func = types.MethodType(func, a) # or types.MethodType(func, a, A) for PY2
a.func()

显示从

调用我的
,但这并不是真正向
obj
添加方法
obj.func()
与只调用
func()
相同。方法将实例作为1接收。位置参数。您可以使用
func.\uuuuu get\uuuj(obj,a)
创建绑定方法,但这也不起作用,因为
func
不带参数。您的函数
func
没有
self
参数。当您想要附加或替换类的方法时,可以使用
type
。在这里,您只是将一个函数附加到一个类上。所以简言之,这意味着我将无法使用我在其上使用的对象的属性。例如,如果在我的定义中有一个属性,比如说
att
,那么我就不能正确地使用它了?在你的问题中,函数与对象是解耦的。无法从函数访问对象,因为函数根本不是一个方法。@ABHI不,
att
可以从任何地方访问,但您需要类的实例来访问它(即
att
本身并不意味着什么,您需要
obj.att
)。通常定义的方法(因此被绑定)获得
self
参数,该参数是方法绑定到的实例,因此它们可以轻松地获得相应的
att
。请注意,在Python 3中
types.MethodType
只接受两个参数,因此在本例中,调用是
types.MethodType(func,a)