如何通过Boost Python在运行时为C++导出的Python对象添加方法?
在Boost.Python导出的类中添加Python侧方法获取TopX
首先先提一下你现有Boost.Python代码里的一个小问题:你写的init<RectObject>(int,int,int,int)应该改成init<int, int, int, int>,因为这里是要导出接受四个int参数的构造函数,不是用RectObject作为构造参数~
接下来给你两种可行的解决方案:
方案1:在C++导出阶段绑定方法(推荐)
这种方式是Boost.Python的常规做法,性能更高,而且所有Python侧的RectObject实例都能直接使用这个方法。
情况A:你的C++类已有获取TopX的成员函数
如果你的RectObject类已经定义了获取TopX的成员函数,比如:
class RectObject { public: int TopX; // 构造函数 RectObject(int tx, int ty, int bx, int by) : TopX(tx) {} // 获取TopX的成员函数 int getTopX() const { return TopX; } };
那在导出代码里直接绑定这个函数即可:
#include <boost/python.hpp> using namespace boost::python; class_<RectObject> Embedded_RectObject("RectObject"); // 修正构造函数导出 Embedded_RectObject.def(init<int, int, int, int>()); Embedded_RectObject.def_readwrite("TopX", &RectObject::TopX); // 绑定getTopX方法到Python Embedded_RectObject.def("getTopX", &RectObject::getTopX);
之后在Python里就能直接调用:
RectData = RectObject(10,10,10,10) print(RectData.getTopX()) # 输出 10
情况B:不想修改C++类
如果不想改动原有的C++类,可以用Lambda表达式在导出时绑定逻辑:
Embedded_RectObject.def("getTopX", [](const RectObject& self) { return self.TopX; });
效果和上面完全一样,不用修改RectObject的代码。
方案2:在Python侧动态添加方法
如果没办法重新编译C++代码,或者只是临时给某个实例加方法,可以直接在Python里操作。
给整个类添加方法(所有实例可用)
写一个Python函数,然后绑定到RectObject类上:
def get_top_x(self): return self.TopX # 把方法绑定到RectObject类 RectObject.get_top_x = get_top_x # 使用示例 RectData = RectObject(10,10,10,10) print(RectData.get_top_x()) # 输出 10
这样所有新创建的RectObject实例都能使用get_top_x方法。
只给单个实例添加方法
如果只想给特定的RectData实例加方法,需要用types.MethodType来绑定:
import types def get_top_x(self): return self.TopX # 给RectData实例绑定专属方法 RectData.get_top_x = types.MethodType(get_top_x, RectData) # 调用 print(RectData.get_top_x()) # 输出 10
这种方式下,只有这个RectData实例有这个方法,其他RectObject实例不会受影响。
内容的提问来源于stack exchange,提问作者summation
相关产品推荐
相关产品推荐

