如何创建自定义类对象的绑定关系
首先创建文件animal.cpp,自定义一个简单的C++类对象:
class Dog {public: Dog(const std::string &name) :m_name(name) {} void setName(const std::string &name) {m_name = name;} const std::string &getName const {return m_name;}private: std::string m_name;}
pybind11的绑定代码如下:
#include namespace py = pybind11;PYBIND11_MODULE(animal, m) { py::class_(m, "Dog") .def(py::init()) .def("setName", &Dog::setName) .def("getName", &Dog::getName);}
其中py::class_ 创建了C++类结构的绑定关系,init()函数封装了类的构造函数。通过下面的命令编译:
g++ -O3 -Wall -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` animal.cpp -o animal.so
得到dog.so库,在所在目录下执行:
>>> import animal>>> d = animal.Dog('Oreo')>>> print(d)>>> d.getName()'Oreo'>>> d.setName('Winson')>>> d.getName()'Winson'
如何绑定lambda函数
在上面的例子中,可以看到print(d)的输出信息难以理解,在python中,可以通过特殊的方法名__repr__来返回可读性比较好的信息,而在C++类中并没有合适的数据结构可以实现这一点。此时可以通过绑定一个Lambda函数来解决:
py::class_ (m, "Dog") .def(py::init()) .def("setName", &Dog::setName) .def("getName", &Dog::getName) .def("__repr__", [](const Dog &d) { return ""; });
此时编译后再执行print(d)所得到信息为:
...>>> print(d)
如何使类对象的成员变量被访问
在上面的例子中m_name是私有的类成员变量,为了让它能被python直接访问,可以通过class_::def_property()方法为私有成员变量设置setter和getter处理函数:
py::class_(m, "Dog") .def(py::init()) .def_property("name", &Dog::getName, &Dog::setName) // ... remainder ...
如果希望成员变量是只读的,可以将setter设置为nullptr:
py::class_(m, "Dog") .def(py::init()) .def_property("name", &Dog::getName, nullptr) // ... remainder ...
同理只写的只需将getter设置为nullptr。