【问题标题】:Accessing instance variables of a class from pybind11 wrappers从 pybind11 包装器访问类的实例变量
【发布时间】:2020-05-09 20:41:42
【问题描述】:

我还没有找到用 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


    【解决方案1】:

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

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

    用法:

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

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

    【讨论】:

    • 当 .def 语句提供 lambda 而不是指向类的现有方法的指针时,是否总是提供 lambda 函数的第一个实例参数?
    • 据我所知:是的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 2012-08-20
    • 1970-01-01
    • 2011-05-11
    • 2011-02-21
    • 2012-05-21
    相关资源
    最近更新 更多