在我们的代码库中,有一些由SWIG结合的Python和C ++。 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
?
答案 0 :(得分:3)
将一个函数分配给一个类属性,并通过new_instancemethod()
(我假设它是方法构造函数的Swig别名,例如types.MethodType
)完全相同。您可以通过查看type(DiscreteKey.baseData)
来确定。无论方法如何分配,都将是<type 'instancemethod'>
。
但是,在将函数分配给实例时,new_instancemethod()
构造函数很有用。如果没有方法“wrapper”,这将无效。