《掌握 Pybind11:Python/C++ 类型系统映射与类导出技巧》

Pybind11 中的类绑定

1. 基本类绑定示例

#include <pybind11/pybind11.h>
namespace py = pybind11;

class Pet {
public:
    Pet(const std::string &name) : name(name) {}
    void setName(const std::string &name_) { name = name_; }
    const std::string &getName() const { return name; }
private:
    std::string name;
};

PYBIND11_MODULE(example, m) {
    py::class_<Pet>(m, "Pet")
        .def(py::init<const std::string &>())
        .def("setName", &Pet::setName)
        .def("getName", &Pet::getName);
}

2. 类绑定高级特性

  1. 构造函数重载
.def(py::init<const std::string &>())
.def(py::init<>())  // 默认构造函数
  1. 成员变量绑定
.def_readwrite("name", &Pet::name)  // 读写访问
.def_readonly("name", &Pet::name)   // 只读访问
  1. 静态成员
.def_static("static_method", &Pet::staticMethod)
  1. 继承
    如果不声明继承,则需要手动绑定子类方法。
py::class_<Dog, Pet>(m, "Dog")  // Dog 继承自 Pet
    .def(py::init<const std::string &>());

3. 类型转换注意事项

Python 类型C++ 类型说明
Nonestd::nullptr_t空值
boolbool布尔值
intint, long, unsigned int, size_t整数
floatfloat, double浮点数
strstd::string, char*, std::string_view字符串
bytesstd::string, char*, std::string_view字节串
tuplestd::tuple<...>元组
liststd::vector<...>, std::list<...>列表
dictstd::map<...>, std::unordered_map<...>字典
setstd::set<...>, std::unordered_set<...>集合
functionstd::function<...>函数/可调用对象
objectpy::object通用 Python 对象
Anypy::object 或模板参数任意类型
array.arraystd::array<...>固定大小数组
numpy.ndarraypy::array_t<...>NumPy 数组
memoryviewpy::memoryview内存视图
slicepy::slice切片对象
typepy::type类型对象
  1. 自动转换:Pybind11 会自动在 Python 和 C++ 类型之间进行转换。
  2. 自定义类型:可以使用 py::class_ 绑定自定义 C++ 类型。
  3. 类型检查:可以使用 py::isinstance<...>() 检查 Python 对象的类型。
  4. 类型转换失败:如果转换失败,Pybind11 会抛出 py::cast_error 异常。
  5. STL 容器:Pybind11 提供了对 STL 容器的自动转换支持,包括 std::vector, std::map 等。
  6. NumPy 支持:通过 py::array_t 可以高效地与 NumPy 数组交互。
  7. 智能指针:支持 std::shared_ptr, std::unique_ptr 等智能指针类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值