如何将Cython自定义类传入Python可调用的Cython函数?
解决方案
要让Python能把自定义类传入Cython函数,核心是用**Cython包装类(cdef class)**作为Python层与C++层的桥梁,具体操作如下:
- 在你的
myClass包装类中添加一个cdef成员变量,用来存储C++原生类的实例指针:
cdef extern from "myClass.h": cdef cppclass C_myClass "myClass": C_myClass(float*, int*, int*) # 修正构造函数写法(原代码误写为void) void _increment(C_myClass, float) cdef class myClass: cdef C_myClass* c_instance # 存储C++类的实例指针 def __init__(self, float* arr, int a, int b): # 初始化C++实例,参数匹配构造函数定义 self.c_instance = new C_myClass(arr, &a, &b) def __dealloc__(self): # 析构时释放C++实例,避免内存泄漏 if self.c_instance is not NULL: del self.c_instance def some_other_util(self): # 自定义工具方法示例 pass
- 修改
increment函数,让它接收Python可见的myClass对象,再从对象中取出C++实例传给底层C函数:
def increment(myClass obj, float value): # 取出包装类中的C++实例,传入底层函数 _increment(*obj.c_instance, value)
关键说明
def函数只能接收Python对象,因此不能直接用C_myClass作为参数,必须用我们定义的myClass包装类。- 包装类的
c_instance是Cython层面的私有成员,Python层无法直接操作,保证了底层C++实例的安全性。 - 必须实现
__dealloc__方法释放C++实例,否则会造成内存泄漏。
内容的提问来源于stack exchange,提问作者TheGitPuller
相关产品推荐
相关产品推荐

