如何从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
相关产品推荐
相关产品推荐

