在我们的代码库中,有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?
解决方法:
将一个函数分配给一个类属性,然后通过new_instancemethod()(我认为这是方法构造函数的Swig别名,例如types.MethodType)进行完全相同的操作.您可以通过检查type(DiscreteKey.baseData)来判断.不管如何分配方法,它都是<类型'instancemethod'>.
但是,将函数分配给实例时,new_instancemethod()构造函数很有用.没有方法“包装器”,这将无法工作.