You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pybind11中绑定采用值初始化的C++空参构造函数?

解决pybind11绑定无参构造类的Python实例创建问题

问题根源

你遇到编译错误的核心原因是:py::init<...>()要求C++类必须提供对应参数列表的构造函数,但你的MyClass只有无参构造,编译器找不到匹配的重载,因此报错。

可行解决方案

方案1:修改C++类添加带参构造(优先选择,若允许修改源码)

如果旧项目的C++代码允许调整,直接给MyClass新增带参数的构造函数是最简洁的方式:

class MyClass {
public:
    int a, b, c, d;
    // 原无参构造
    MyClass() : a(0), b(0), c(0), d(0) {}
    // 新增带参构造
    MyClass(int a_val, int b_val, int c_val, int d_val) 
        : a(a_val), b(b_val), c(c_val), d(d_val) {}
};

然后在pybind11绑定代码中直接使用带参数的py::init:

py::class_<MyClass>(m, "MyClass")
    .def(py::init<int, int, int, int>(), 
         py::arg("a"), py::arg("b"), py::arg("c"), py::arg("d"))
    .def_property_readonly("a", &MyClass::a)
    .def_property_readonly("b", &MyClass::b)
    .def_property_readonly("c", &MyClass::c)
    .def_property_readonly("d", &MyClass::d);

Python端即可直接用MyClass(1,2,3,4)创建实例。

方案2:不修改C++类,用lambda工厂函数绑定(适合无法改源码的场景)

如果不能改动MyClass的源码,可通过pybind11的lambda表达式实现“伪带参构造”:先创建无参实例,再给成员变量赋值后返回。
绑定代码示例:

py::class_<MyClass>(m, "MyClass")
    // 同时支持无参和带参创建
    .def(py::init<>())
    .def(py::init([](int a, int b, int c, int d) {
        auto obj = new MyClass();
        // 假设成员变量为public,若为private需调用类的setter方法
        obj->a = a;
        obj->b = b;
        obj->c = c;
        obj->d = d;
        return obj;
    }), py::arg("a"), py::arg("b"), py::arg("c"), py::arg("d"))
    .def_property_readonly("a", &MyClass::a)
    .def_property_readonly("b", &MyClass::b)
    .def_property_readonly("c", &MyClass::c)
    .def_property_readonly("d", &MyClass::d);

方案3:Python端后续赋值(备选方案)

如果上述C++端调整都不方便,可在Python创建无参实例后直接赋值(需先将绑定改为支持写操作):
首先修改绑定代码,将只读属性改为可写:

py::class_<MyClass>(m, "MyClass")
    .def(py::init<>())
    .def_property("a", &MyClass::a, [](MyClass& self, int val) { self.a = val; })
    .def_property("b", &MyClass::b, [](MyClass& self, int val) { self.b = val; })
    .def_property("c", &MyClass::c, [](MyClass& self, int val) { self.c = val; })
    .def_property("d", &MyClass::d, [](MyClass& self, int val) { self.d = val; });

Python端使用方式:

obj = MyClass()
obj.a = 1
obj.b = 2
obj.c = 3
obj.d = 4

内容的提问来源于stack exchange,提问作者Michele Peresano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 01:03:37