何时使用new.instancemethod vs为类分配方法

时间:2012-02-13 23:36:15

标签: python swig

在我们的代码库中,有一些由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

1 个答案:

答案 0 :(得分:3)

将一个函数分配给一个类属性,并通过new_instancemethod()(我假设它是方法构造函数的Swig别名,例如types.MethodType)完全相同。您可以通过查看type(DiscreteKey.baseData)来确定。无论方法如何分配,都将是<type 'instancemethod'>

但是,在将函数分配给实例时,new_instancemethod()构造函数很有用。如果没有方法“wrapper”,这将无效。