何时使用 new.instancemethod 与将方法分配给类
在我们的代码库中,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 吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
将函数分配给类属性,并通过 new_instancemethod() 执行相同的操作(我假设它是方法构造函数的 Swig 别名,例如 types.MethodType)是完全一样的相等的。您可以通过检查
type(DiscreteKey.baseData)
来判断。无论方法是如何分配的,它都将是
。但是,在将函数分配给实例时,
new_instancemethod()
构造函数非常有用。如果没有“包装器”方法,这将无法工作。Assigning a function to a class attribute, and doing the same via
new_instancemethod()
(which I assume is a Swig alias for the method constructor, e.g.types.MethodType
) are exactly equivalent. You can tell by checkingtype(DiscreteKey.baseData)
. Regardless of how the method was assigned, it will be<type 'instancemethod'>
.The
new_instancemethod()
constructor is useful when assigning functions onto instances, however. This won't work without the method "wrapper."