何时使用 new.instancemethod 与将方法分配给类

发布于 2025-01-06 01:04:01 字数 866 浏览 0 评论 0 原文

在我们的代码库中,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 吗?

In our codebase there is Python and C++ married by SWIG. The C++ classes are sometimes given Python extensions like so:

%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)

%}

or

%pythoncode %{

def ParmID_hash(parmID):
    return hash(str(parmID))

ParmID.__hash__ = ParmID_hash

%}

What is the difference between using new.instancemethod to attach a method to a class, vs. simply assigning it, as in the second example? Could the first example be changed to simply

DiscreteKey.baseData = DiscreteKey_baseData
DiscreteKey.asSet = DiscreteKey_asSet

? (note that baseData takes another argument)

Or is the second example actually deficient in some way, and should be using new_instancemethod too?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不一样的天空 2025-01-13 01:04:01

将函数分配给类属性,并通过 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 checking type(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."

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文