何时使用new.instancemethod与将方法赋值给类
在我们的代码库中,有用Python和C++结合的部分,使用了一个叫SWIG的工具。C++的类有时候会添加一些Python的扩展,像这样:
%pythoncode %{
def DiscreteKey_baseData(self, baseData):
pass
def DiscreteKey_asSet(self):
pass
DiscreteKey.baseData = new_instancemethod(DiscreteKey_baseData, None, DiscreteKey)
DiscreteKey.asSet = new_instancemethod(DiscreteKey_asSet, None, DiscreteKey)
%}
或者这样:
%pythoncode %{
def ParmID_hash(parmID):
return hash(str(parmID))
ParmID.__hash__ = ParmID_hash
%}
那么,使用new.instancemethod来给一个类添加方法,和直接给方法赋值(就像第二个例子那样),有什么区别呢?第一个例子能不能简单改成
DiscreteKey.baseData = DiscreteKey_baseData
DiscreteKey.asSet = DiscreteKey_asSet
?(注意,baseData
需要另一个参数)
或者说,第二个例子有什么不足之处,应该也使用new_instancemethod
吗?
1 个回答
3
把一个函数赋值给一个类的属性,和通过 new_instancemethod()
来做这件事是完全一样的。我猜这个 new_instancemethod()
是一个别名,用来表示方法的构造器,比如 types.MethodType
。你可以通过检查 type(DiscreteKey.baseData)
来确认这一点。不管这个方法是怎么被赋值的,结果都是 <type 'instancemethod'>
。
不过,new_instancemethod()
这个构造器在把函数赋值给实例的时候是很有用的。如果没有这个方法的“包装”,就不能正常工作。