Pybind11/Nanobind:如何返回类对象并使用 Python 中的方法。如何将 C++ 对象转换为可以在 Py

问题描述 投票:0回答:1

我不知道为什么我找不到任何好的讨论,我从昨天开始就一直在寻找。

如何从 C++ 绑定返回类对象并在 Python 中使用其方法,即:

class A {
    ...
    void foo() {
        py::print("Hello world");
    }
}

class B {
    ...
    A bar() {
        a = A();
        // What do I return here if I want to return a and use it in Python
        // return a
    }
}

我想绑定 B 并在 Python 中使用它

b_object = B()
a = b_object.bar()
a.foo()

如何在 Pybind、Nanobind 或 Boost Python 中执行此操作(如果后者的语法类似)。

创建

B
绑定时无法使用 lambda。该用例实际上比我在这里展示的更复杂。

python c++ boost-python pybind11 nanobind
1个回答
0
投票

我可以确认我所需要做的就是为两者添加绑定吗 PYBIND_MODULE 中的类,然后我可以将类返回为 是?

我相信 nanobind 也是如此,为它提供绑定将其注册为 Python 中的类型。如果您想要更复杂的交互,则需要额外的绑定(例如

A
列表,需要使用
bind_vector
指定它)。

完成示例:

#include <nanobind/nanobind.h>
namespace nb = nanobind;
#include <memory>

class A {
public:
    A(){};
    void foo() {
        nb::print("Hello world");
    }
};

class B {
public:
    B(){};
    A bar() {
        A a = A();
        return a;
    }
};

NB_MODULE(example, m) {
    nb::class_<A>(m, "A")
    .def(nb::init<>())
    .def("foo", &A::foo)
    ;
    nb::class_<B>(m, "B")
    .def(nb::init<>())
    .def("bar", &B::bar)
    ;
}

输出:

>>> import example
>>> from example import *
>>> a = A()
>>> b = B()
>>> a.foo()
Hello world
>>> b.bar()
<example.A object at 0x7faa93f960d0>
>>> a = b.bar()
>>> a.foo()
Hello world
© www.soinside.com 2019 - 2024. All rights reserved.