在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
- 当添加
时,您创建了一个绑定方法,它的行为与对象的普通Python方法类似,您必须将它所属的对象作为第一个参数(通常称为MethodType
),并且您可以在函数内部访问它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)