c++ 向pybind11类示例添加属性

dced5bon  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(176)

我从https://github.com/pybind/cmake_example开始,在main.cpp中添加了一个简单的结构Value

struct Value {
    int a, b;
};

在python中暴露于:

py::class_<Value> cl(m, "Value");
  cl.def(pybind11::init<>());
  cl.def_readwrite("a", &Value::a);
  cl.def_readwrite("b", &Value::b);

我的问题是Value的任何示例都是不可扩展的,我希望通过仅在运行时可用的信息在python中完成这个结构:

>>> import cmake_example
>>> val = cmake_example.Value()
>>> val.a = 5
>>> val.b
0
>>> val.c = 30
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'cmake_example.Value' object has no attribute 'c'

有没有办法规避这种行为?

hc2pp10m

hc2pp10m1#

绑定类时需要添加py::dynamic_attr()

py::class_<Value> cl(m, "Value", py::dynamic_attr());
//                               ^-- here
  cl.def(pybind11::init<>());
  cl.def_readwrite("a", &Value::a);
  cl.def_readwrite("b", &Value::b);

参见pybind11文档。

相关问题