从 pybind11 包装器访问 class 的实例变量

Accessing instance variables of a class from pybind11 wrappers

我还没有找到用 pybind11 做一件相当简单的事情的方法。假设我有一个聚合 class,我想获取 class 的一个实例变量,这样我就可以深入研究它:

struct foo {
  int x;
};

struct baz {
  foo var;
}

PYBIND11_MODULE(test, m) {
  py::class_<baz>(m, "baz")
  .def(py::init<>())
  .def("GetX", /* need a lambda to return var.x */ )
  ;
}

我没有在文档中找到任何执行此操作的内容,这似乎是一件显而易见的事情。我可以在 baz 中创建访问器方法,但这是额外的工作。我想在包装器代码的 lambda 中完成它。

下面的 lambda 创建了必要的 GetX 成员函数,它需要一个参数:一个 baz 实例。当在包装器 class.

的实例上调用 GetX 时,该参数由 pybind11 提供
  ...
  .def("GetX", [](const baz &b) { return b.var.x; });

用法:

>>> import ex
>>> v = ex.baz()
>>> v.GetX()
0

另请参阅 binding lambda functions 上的 pybind11 文档部分。