我不知道为什么我找不到任何好的讨论,我从昨天开始就一直在寻找。
如何从 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。该用例实际上比我在这里展示的更复杂。
我可以确认我所需要做的就是为两者添加绑定吗 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