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

如何从Cython类调用Python类?跨类调用属性报错求助

解决方案

你的问题主要来自两个核心问题:Cython类的属性声明规则,以及代码中不必要的继承+方法参数不匹配。下面是具体的修正步骤和原因说明:

1. 修正Cython SDK类的属性声明

Cython的cdef class对属性的要求比普通Python类严格,必须提前声明属性类型,否则self.master不会被视为类的有效属性,后续访问时会提示“属性不存在”。

修改atcore_py.pyx中的代码:

cdef class AndorCameraSDK(object):
    # 提前声明master属性的类型为object(兼容所有Python对象)
    cdef object master

    def __cinit__(self, master):
        print('SDK Init') # Show that AndorCameraSDK.__init__ runs
        self.master = master # 现在赋值会被正确绑定到类属性
    def LiveAcquisition(self):
        print('SDK LiveAcquisition') # Show that AndorCameraSDK.LiveAcquisition runs
        pBuf = 'Some data' # Dummy data
        self.master.LivePlot(pBuf) # 现在可以正常访问master的方法

2. 修正GUI类的继承与方法参数

你的GUI类不需要继承SDK,而是通过组合的方式持有SDK实例;同时需要给LivePlot添加参数以接收SDK传递的数据。

修改第二个文件中的代码:

import AndorCameraSDK as andorcamera

# 去掉不必要的继承,GUI作为独立类持有SDK实例
class AndorCameraGUI:
    def __init__(self):
        print('GUI Init') # Show that AndorCameraGUI.__init__ runs

    def LiveImageGUI(self):
        print('GUI LiveImageGUI') # Show that AndorCameraGUI.LiveImageGUI runs
        # 创建SDK实例并传入自身作为master
        self.camera = andorcamera.AndorCameraSDK(self)
        self.camera.LiveAcquisition() # 调用SDK的采集方法

    def LivePlot(self, pBuf):
        print('GUI LivePlot') # Show that AndorCameraGUI.LivePlot runs
        # 可以在这里处理SDK传递过来的数据
        print(f'Received buffer data: {pBuf}')

# 运行测试
app = AndorCameraGUI()
app.LiveImageGUI()

为什么这样修改?

  • Cython属性声明:cdef class的属性必须提前声明类型,否则Cython不会为其分配内存空间,导致后续访问self.master时提示属性不存在。
  • 去掉不必要的继承:你的业务逻辑是GUI调用SDK,而非GUI是SDK的子类,继承在这里会引入不必要的初始化参数问题(SDK的__cinit__需要master参数,而GUI初始化时无法自动满足)。
  • 参数匹配:SDK调用LivePlot(pBuf)时传递了数据,GUI的LivePlot必须定义对应的参数才能接收,否则会触发参数不匹配的错误。

运行修正后的代码,你会看到预期的输出:

GUI Init
GUI LiveImageGUI
SDK Init
SDK LiveAcquisition
GUI LivePlot
Received buffer data: Some data

内容的提问来源于stack exchange,提问作者aishwarya selvaraj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:15:45