PyBind11:访问 Python 中的唯一指针属性
PyBind11: Accessing a unique pointer attribute in Python
我有一个 c++ class,它有一个指向对象的唯一指针作为属性。我希望能够访问 Python 中的那个属性,这样我就可以调用它的 class 方法。这是我的设置示例:
class OuterClass {
public:
std::unique_ptr<InnerClass> obj;
}
class InnerClass {
public:
void method();
}
以及 pybind11 绑定:
PYBIND11_MODULE(example, m) {
py::class_<InnerClass>(m, "InnerClass")
.def("method", &InnerClass::method);
py::class_<OuterClass>(m, "OuterClass")
.def_readonly("obj", &OuterClass::obj);
}
但是,编译失败并出现错误 error: no matching function for call to ‘pybind11::cpp_function::cpp_function(std::unique_ptr<InnerClass> OuterClass::*, pybind11::name, pybind11::is_method, pybind11::sibling)
我希望能够在 python:
outer_obj.obj.method()
unique ptr 的文档似乎不认为这应该是一个问题,因为他们给出了一个 returns unique ptr 的函数示例。是否试图访问唯一的 ptr 属性问题?我该如何解决这个问题?
使用 def_property
和 lambda 到 return 指针:
class InnerClass {
public:
void method()
{
std::cout << "OK" << std::endl;
}
};
class OuterClass {
public:
OuterClass()
: obj(std::make_unique<InnerClass>())
{
}
std::unique_ptr<InnerClass> obj;
};
PYBIND11_MODULE(example, m) {
py::class_<InnerClass>(m, "InnerClass")
.def("method", &InnerClass::method);
py::class_<OuterClass>(m, "OuterClass", py::dynamic_attr())
.def(py::init<>())
.def_property_readonly("obj", [](const OuterClass& o){return o.obj.get();}, py::return_value_policy::reference_internal);
}
我有一个 c++ class,它有一个指向对象的唯一指针作为属性。我希望能够访问 Python 中的那个属性,这样我就可以调用它的 class 方法。这是我的设置示例:
class OuterClass {
public:
std::unique_ptr<InnerClass> obj;
}
class InnerClass {
public:
void method();
}
以及 pybind11 绑定:
PYBIND11_MODULE(example, m) {
py::class_<InnerClass>(m, "InnerClass")
.def("method", &InnerClass::method);
py::class_<OuterClass>(m, "OuterClass")
.def_readonly("obj", &OuterClass::obj);
}
但是,编译失败并出现错误 error: no matching function for call to ‘pybind11::cpp_function::cpp_function(std::unique_ptr<InnerClass> OuterClass::*, pybind11::name, pybind11::is_method, pybind11::sibling)
我希望能够在 python:
outer_obj.obj.method()
unique ptr 的文档似乎不认为这应该是一个问题,因为他们给出了一个 returns unique ptr 的函数示例。是否试图访问唯一的 ptr 属性问题?我该如何解决这个问题?
使用 def_property
和 lambda 到 return 指针:
class InnerClass {
public:
void method()
{
std::cout << "OK" << std::endl;
}
};
class OuterClass {
public:
OuterClass()
: obj(std::make_unique<InnerClass>())
{
}
std::unique_ptr<InnerClass> obj;
};
PYBIND11_MODULE(example, m) {
py::class_<InnerClass>(m, "InnerClass")
.def("method", &InnerClass::method);
py::class_<OuterClass>(m, "OuterClass", py::dynamic_attr())
.def(py::init<>())
.def_property_readonly("obj", [](const OuterClass& o){return o.obj.get();}, py::return_value_policy::reference_internal);
}