首页 > 解决方案 > 从 pybind11 包装器访问类的实例变量

问题描述

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

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 中执行此操作。

标签: c++pybind11

解决方案


下面的 lambda 创建了必要的GetX成员函数,它需要一个参数:一个baz实例。GetX当在包装类的实例上调用时,该参数由 pybind11 提供。

  ...
  .def("GetX", [](const baz &b) { return b.var.x; });

用法:

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

另请参阅绑定 lambda 函数的 pybind11 文档部分。


推荐阅读