一种将 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 a
是 A
类型(调用它时会检查类型)。这样它就知道 a._this
并且不会将其视为 Python 属性查找。如果 Cython 完全知道类型,您只能访问 cdef
ed 属性。
【讨论】:
以上是关于一种将 c++ 对象传递给 cython 中另一个对象方法的方法的主要内容,如果未能解决你的问题,请参考以下文章