如何为pybind11暴露的C++ Value类实例添加动态属性?
解决pybind11暴露的C++类无法添加动态属性的问题
pybind11默认生成的Python绑定类不支持动态添加运行时属性,这是因为默认配置下没有启用动态属性存储机制,直接赋值新属性会触发AttributeError。
解决方案
在定义py::class_时添加py::dynamic_attr()参数,开启动态属性支持:
修改后的绑定代码如下:
py::class_<Value>(m, "Value", py::dynamic_attr()) .def(pybind11::init<>()) .def_readwrite("a", &Value::a) .def_readwrite("b", &Value::b);
原理说明
py::dynamic_attr()会让pybind11为生成的Python类实例附加一个内部字典,专门用来存储运行时添加的额外属性。修改后,你就可以在Python中正常执行val.c = 30这类动态属性赋值操作了。
如果需要对属性添加逻辑做自定义控制,还可以额外绑定__setattr__和__getattr__方法,但py::dynamic_attr()是解决该问题最直接简便的方式。
内容的提问来源于stack exchange,提问作者Johann cohen-tanugi
相关产品推荐
相关产品推荐

