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

如何从Python调用C编写的GObject类方法?实例化及调用报错求解

问题根源

你使用了错误的GObject类型声明宏。G_DECLARE_DERIVABLE_TYPE 用于声明允许外部代码派生的类,要求你必须手动定义公开的实例结构体,且结构体第一个成员为父类实例。你当前没有定义该实例结构体,导致生成的introspection元数据缺失核心类型信息,PyGObject无法正确识别这是GObject子类,才会出现类型校验失败、实例化流程异常、段错误等问题。

解决方案

有两种适配方案,按需选择即可:

方案1:改为不可派生的Final类型(推荐,适配你当前的代码写法)

如果你的类不需要对外提供派生能力,直接替换声明宏即可:
将 bop.h 中的

G_DECLARE_DERIVABLE_TYPE(BopFooObj, bop_foo_obj, BOP, FOO_OBJ, GObject);

替换为

G_DECLARE_FINAL_TYPE(BopFooObj, bop_foo_obj, BOP, FOO_OBJ, GObject);

G_DECLARE_FINAL_TYPE 会自动处理实例结构体的定义,完全适配你当前使用 G_DEFINE_TYPE_WITH_PRIVATE 存储私有成员的写法。

方案2:保留可派生能力,补充公开实例结构体定义

如果你确实需要允许其他代码派生该类,在 bop.h 中 G_DECLARE_DERIVABLE_TYPE 语句下方补充实例结构体定义:

struct _BopFooObj {
  GObject parent_instance;
  /* 如有需要可在此添加公开的实例成员,无则仅保留父类成员即可 */
};

后续操作

修改代码后重新编译动态库,重新生成 .gir 和 .typelib 文件,再运行Python代码即可恢复正常:Bop.FooObj() 和 Bop.FooObj.new() 两种实例化方式都可以正常工作,方法调用也不会抛出异常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:45:02