一种将 c++ 对象传递给 cython 中另一个对象方法的方法

Posted

技术标签:

【中文标题】一种将 c++ 对象传递给 cython 中另一个对象方法的方法【英文标题】:A way to pass c++ object to another object's method in cython 【发布时间】:2016-09-01 21:13:48 【问题描述】:

我有两个类(让我们假设最简单的类,实现并不重要)。我的defs.pxd 文件(带有 cython defs)如下所示:

cdef extern from "A.hpp":
  cdef cppclass A:
    A() except +

cdef extern from "B.hpp":
  cdef cppclass B:
    B() except +
    int func (A)

我的pyx 文件(带有python defs)如下所示:

from cython.operator cimport dereference as deref
from libcpp.memory cimport shared_ptr

cimport defs

cdef class A:
    cdef shared_ptr[cquacker_defs.A] _this

    @staticmethod
    cdef inline A _from_this(shared_ptr[cquacker_defs.A] _this):
        cdef A result = A.__new__(A)
        result._this = _this
        return result

    def __init__(self):
        self._this.reset(new cquacker_defs.A())

cdef class B:
    cdef shared_ptr[cquacker_defs.B] _this

    @staticmethod
    cdef inline B _from_this(shared_ptr[cquacker_defs.B] _this):
        cdef B result = B.__new__(B)
        result._this = _this
        return result

    def __init__(self):
        self._this.reset(new cquacker_defs.B())

    def func(self, a):
      return deref(self._this).func(deref(a._this))

问题是deref(self._this) 工作正常,但deref(a._this) 没有出现此错误:

Invalid operand type for '*' (Python object)

如何将一个 python 对象的内部 c++ 对象传递给另一个 python 中的方法?

【问题讨论】:

【参考方案1】:
def func(self, A a):
    return # ... as before

你需要告诉 Cython aA 类型(调用它时会检查类型)。这样它就知道 a._this 并且不会将其视为 Python 属性查找。如果 Cython 完全知道类型,您只能访问 cdefed 属性。

【讨论】:

以上是关于一种将 c++ 对象传递给 cython 中另一个对象方法的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cythonize() 上使用 annotate=True

如何将 C++ 对象传递给 C# 类库

将 C++ 对象传递给 C#

将 QObject 指针从 QML 对象传递给 C++

如何将参数传递给 Script 标签?

将 typeof 作为参数传递给来自 xaml 的命令