模板使用自定义类型_【python编程】C++自定义类型在pybind11的使用

36e3004ad5869ca130fccb949ef1c495.png

如何创建自定义类对象的绑定关系

首先创建文件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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值