我有一个简单的类定义:
class State {
private:
Eigen::Vector3f m_data;
public:
State(const Eigen::Vector3f& state) : m_data(state) { }
Eigen::Vector3f get() const { return m_data; }
void set(const Eigen::Vector3f& _state) { m_data = _state; }
std::string repr() const {
return "state data: [x=" + std::to_string(m_data[0]) + ", y=" + std::to_string(m_data[1]) + ", theta=" + std::to_string(m_data[2]) + "]";
}
};
然后我用pybind11在python中公开以上内容:
namespace py = pybind11;
PYBIND11_MODULE(bound_state, m) {
m.doc() = "python bindings for State";
py::class_<State>(m, "State")
.def(py::init<Eigen::Vector3f>())
.def("get", &_State::get)
.def("set", &_State::set)
.def("__repr__", &_State::repr);
}
一切正常。我能够将此模块导入python并使用numpy数组构造一个State
实例。这不是我想要的。我希望能够像访问一个numpy数组一样访问该对象;我希望能够在python中执行以下操作:
import bound_state as bs
arr = np.array([1, 2, 3])
a = bs.State(arr)
print(a[0])
(以上抛出了TypeError: 'bound_state.State' object does not support indexing
)
过去,我使用boost :: python通过使用add_property
公开列表,这允许在C ++中对基础数据进行索引。 pybind11是否可以与本征一起使用?有人可以提供一个示例来显示如何公开可索引的State
实例吗?
答案 0 :(得分:0)
对于API Docs,这可以通过def_property
方法轻松完成。
将此位转为
namespace py = pybind11;
PYBIND11_MODULE(bound_state, m) {
m.doc() = "python bindings for State";
py::class_<State>(m, "State")
.def(py::init<Eigen::Vector3f>())
.def("get", &State::get)
.def("set", &State::set)
.def("__repr__", &State::repr);
}
对此:
namespace py = pybind11;
PYBIND11_MODULE(bound_state, m) {
m.doc() = "python bindings for State";
py::class_<State>(m, "State")
.def(py::init<Eigen::Vector3f>())
.def_property("m_data", &State::get, &State::set)
.def("__repr__", &State::repr);
}
现在,从python端,我可以这样做:
import bound_state as bs
arr = np.array([1, 2, 3])
a = bs.State(arr)
print(a.m_data[0])
这不是我想要的完全,而是朝着正确方向迈出的一步。