Я использую pybind11 для предоставления функций C ++ интерфейсу Python. Я хочу обернуть перегруженный оператор присваивания, но не знаю, как это сделать. Представленная документация и примеры на самом деле не охватывают это, по крайней мере, из того, что я видел.
Вот упрощенная версия того, что я пытаюсь сделать:
class Num{
public:
Num(const double& num) : m_val(num), m_type(Num::Type::e_none){}
Num& operator=(const double& rhs){m_val = rhs;}
private:
double m_val;
};
А вот упаковка:
PYBIND11_MODULE(demo, m){
py::class_<Num>(m, "Num")
.def(py::init<const double&>())
// Overloaded assignment operator binding ?
;
}
Моя основная забота - сохранить тип данных Num при назначении его поплавку. например.:
>>> m = Num(4.5)
>>> type(m)
<class 'demo.Num'>
>>> m = 5.5
>>> type(m)
<class 'float'>
Я впервые работаю с расширениями и привязками C ++, поэтому любое понимание того, что мне следует делать, было бы здорово!
__setitem__
, но это ужасный взлом и очень хрупкий). Проблема в том, что Python использует присвоение ссылок, поэтому нет оператора присваивания, который можно было бы переопределить. Чтобы быть конкретным: это второе назначение удаляет старую ссылку наNum
, а затем переназначает на5.5
. Ни в коем случае не задействован какой-либо методNum
. Альтернативой может быть, если всеNum
экземпляры живут в каком-то классе или модуле, тогда вы можете переопределить__setitem__
этого модуля / класса. - person Wim Lavrijsen   schedule 19.03.2020