我将使用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 分配给浮点数时保留 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__
。 - Wim Lavrijsen