Binding assignment operator overload with pybind11

15 views Asked by At

When exposing C++ code with pybind11, I was able to bind the assigment operator overload of MyDouble class as follows:

class MyDouble {
 public:
    MyDouble(double value) : _value(value) { }
    // ...
    MyDouble& operator=(double value) { _value = value; return *this; }
    operator double() const { return _value; }

 protected:
    double _value;
};


class MyClass {
 public:
    MyClass(double value) : member(value) { }
    // ...
    MyDouble member;
    std::string label;
};

// ...

py::class_< MyDouble >(module, "MyDouble")
    .def(py::init< double >(), "value"_a)
    .def("__float__", &MyDouble::operator double);

py::implicitly_convertible< double, MyDouble >();

py::class_< MyClass >(module, "MyClass")
    .def(py::init< double >(), "value"_a)
    .def("__setattr__", [](MyClass& c, const char* name, double value) { if (std::string(name) == "member") { c.member = value; } })
    .def("__setattr__", [](MyClass& c, const char* name, const MyDouble& other) { if (std::string(name) == "member") { c.member = other; } })
    .def("__setattr__", [](MyClass& c, const char* name, const std::string& label) { if (std::string(name) == "label") { c.label = label; } })
    .def_readonly("label", &MyClass::label)     // <- only getter
    .def_readonly("member", &MyClass::member);  // <- only getter

However, the main drawback of this approach is that one becomes unable to define any properties or public members, as __setattr__ will shadow any def_readwrite call. Is there a for __setattr__ to only be called for specific argument types?

0

There are 0 answers