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

如何在SWIG包装器中仅写入结构体成员变量时执行自定义代码?

解决SWIG中仅在写入结构体成员时触发自定义代码的问题

针对你遇到的%exception在读写TAxis::Min时都会执行do_something()的问题,核心原因是SWIG对结构体成员变量的读写会分别生成get_Min和set_Min包装方法,直接对TAxis::Min加%exception会同时作用于这两个方法。下面提供两种可靠的解决方案:

方法一:针对自动生成的setter方法添加%exception

SWIG默认会为结构体成员生成形如set_<成员名>的setter方法,我们可以直接对这个setter单独配置%exception,这样只有写入操作会触发自定义逻辑:

struct TAxis {
    double Min;
    double Max;
};

// 仅对set_Min方法添加异常处理逻辑
%exception TAxis::set_Min {
    $action  // 执行原始的赋值操作
    do_something();  // 写入完成后执行自定义逻辑
}

当你在Python中执行axis.Min = 10.0时,会调用set_Min方法,从而触发do_something();而读取axis.Min时调用的是get_Min,不会执行该函数。

方法二:自定义成员变量的setter/getter方法

如果需要更灵活的控制,可以通过%extend为TAxis添加自定义的setter和getter,同时隐藏原始成员变量,确保Python只能通过这些方法访问:

struct TAxis {
    double Min;
    double Max;
};

// 扩展TAxis类,添加自定义的set/get方法
%extend TAxis {
    void set_Min(double new_val) {
        $self->Min = new_val;
        do_something();  // 写入时执行自定义逻辑
    }

    double get_Min() {
        return $self->Min;  // 读取时直接返回值,不执行额外逻辑
    }
}

// 忽略原始的Min成员变量,避免Python直接访问
%ignore TAxis::Min;

这种方式下,Python中对axis.Min的赋值和读取会自动映射到我们自定义的set_Min和get_Min方法,完全实现读写分离的逻辑控制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:51:59