Python类能否继承SWIG封装的C++类?遇调用错误求解决方案
问题解答:SWIG封装C++类后Python子类类型不匹配问题
核心结论
直接用typedef无法解决这个问题。问题根源是SWIG默认不支持Python子类作为C++基类实例传递,需要启用SWIG的Director特性来实现跨语言的多态支持。
问题原因
你定义的SOFProcessor是纯Python子类,SWIG生成的C扩展代码无法将其识别为EventProcessor*类型——因为SWIG默认只处理C侧定义的类实例,Python子类没有对应的C++对象包装层,导致类型检查失败。
正确解决方案:启用Director特性
修改SWIG接口文件example4.swg,添加%feature("director")标记需要支持跨语言继承的类:
%module example4 // 启用Director特性,允许Python子类被C++代码识别 %feature("director") EventProcessor; %{ #define SWIG_FILE_WITH_INIT #include "example4.h" %} %include "example4.h"
重新编译:
swig -c++ -python example4.swg python3 example4_setup.py build_ext --inplace
修改Python子类的__init__方法,必须显式调用父类构造函数以完成C++侧对象初始化:
import example4 class SOFProcessor(example4.EventProcessor): def __init__(self): super().__init__() print("SOFProcessor.ctor")
测试验证:
>>> d = SOFProcessor() SOFProcessor.ctor >>> d.getValue() 42 >>> example4.registerEventProcessor(100, d) >>> d.getValue() 100
为什么typedef不行?
typedef只是给现有类型起别名,无法改变SWIG对类型的识别逻辑。SWIG需要明确知道要处理跨语言继承场景,必须通过Director特性生成额外的包装代码,让Python子类能够被C++侧的指针/引用正确接受。
内容的提问来源于stack exchange,提问作者Mike Finch
相关产品推荐
相关产品推荐

