如何在SWIG中为类的所有方法批量应用%pythonappend?
给SWIG封装的类所有方法批量添加%pythonappend的正确方式
SWIG确实支持给类的所有成员方法批量追加Python代码,不需要用setattr动态处理。你之前的写法无效,主要是因为通配符匹配范围不对,或者语法使用有误,以下是两种可靠的实现方式:
方式一:通配符+Python层过滤
直接用SampleClass::*匹配所有成员,然后在追加的Python代码里排除构造函数、析构函数和成员变量,只对普通方法生效:
%module myclass %{ #include "myheader.hpp" %} # 提前导入需要的Python模块 %pythoncode %{ import inspect %} # 批量追加Python代码到SampleClass的所有成员 %pythonappend SampleClass::* %{ func_name = inspect.currentframe().f_code.co_name # 只处理普通成员方法,排除构造/析构函数 if func_name not in ['__init__', '__del__'] and callable(getattr(self, func_name)): # 这里写你的Python逻辑 print(f"Appended code executed for {self.__class__.__name__}.{func_name}") %} %include "myheader.hpp"
方式二:SWIG层面过滤(更高效)
利用SWIG内置的%$ismethod宏,在SWIG语法层面直接只匹配成员方法,避免Python层的判断:
%module myclass %{ #include "myheader.hpp" %} # 给SampleClass的所有成员方法追加Python代码 %feature("pythonappend") SampleClass::* %{ $ismethod %} %{ # 这里的代码只会被追加到普通成员方法上,构造函数和变量不会触发 print("Doing python stuff for method call") %} %include "myheader.hpp"
为什么你之前的写法无效?
%pythonappend SampleClass::*:通配符会匹配构造函数(__init__)、析构函数和成员变量,这些成员的Python代码结构和普通方法不同,导致追加的代码无法正常执行,甚至引发错误。%feature("pythonappend", %$isfunction) SampleClass:语法错误,%feature需要指定具体的成员通配符(而非类本身),且条件参数的写法不符合SWIG规范。
内容的提问来源于stack exchange,提问作者LateBird
相关产品推荐
相关产品推荐

