You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Cython自定义类传入Python可调用的Cython函数?

解决方案

要让Python能把自定义类传入Cython函数,核心是用**Cython包装类(cdef class)**作为Python层与C++层的桥梁,具体操作如下:

  1. 在你的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
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 06:35:37