如何在Pybind11/Nanobind中返回C++类对象并在Python调用其方法
如何在Pybind11/Nanobind/Boost.Python中实现C++类方法返回另一个类对象并在Python中调用其方法
需求概述
需要实现:C++中类B的bar()方法返回类A的对象,在Python中调用该返回对象的foo()方法。以下是三种主流绑定框架的实现方案,均无需使用lambda表达式。
Pybind11 实现
C++绑定代码
#include <pybind11/pybind11.h> #include <pybind11/print.h> namespace py = pybind11; class A { public: void foo() { py::print("Hello world"); } }; class B { public: A bar() { A a; return a; // 直接返回栈上的A对象即可 } }; PYBIND11_MODULE(example, m) { // 绑定类A py::class_<A>(m, "A") .def(py::init<>()) .def("foo", &A::foo); // 绑定类B,无需lambda,直接绑定bar方法 py::class_<B>(m, "B") .def(py::init<>()) .def("bar", &B::bar); }
Python调用代码
import example b_object = example.B() a = b_object.bar() a.foo() # 输出: Hello world
Nanobind 实现
Nanobind语法与Pybind11高度相似,实现逻辑一致:
C++绑定代码
#include <nanobind/nanobind.h> #include <nanobind/print.h> namespace nb = nanobind; class A { public: void foo() { nb::print("Hello world"); } }; class B { public: A bar() { 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); }
Python调用代码
import example b_object = example.B() a = b_object.bar() a.foo() # 输出: Hello world
Boost.Python 实现
C++绑定代码
#include <boost/python.hpp> #include <iostream> namespace bp = boost::python; class A { public: void foo() { std::cout << "Hello world" << std::endl; } }; class B { public: A bar() { A a; return a; } }; BOOST_PYTHON_MODULE(example) { bp::class_<A>("A") .def(bp::init<>()) .def("foo", &A::foo); bp::class_<B>("B") .def(bp::init<>()) .def("bar", &B::bar); }
Python调用代码
import example b_object = example.B() a = b_object.bar() a.foo() # 输出: Hello world
内容的提问来源于stack exchange,提问作者Tommy Wolfheart
相关产品推荐
相关产品推荐

