如何通过Boost Python将Python派生类向上转型为其C++基类?
我有一个C++类,其中有一个纯虚函数,我用Boost Python以以下方式进行了封装:
class Model {
virtual double Test() = 0;
};
class ModelWrapper : public Model, public boost::python::wrapper<Model> {
double Test() {
return this->get_override("Test")();
}
};
BOOST_PYTHON_MODULE(mymodule)
{
class_<ModelWrapper, boost::noncopyable>("Model")
.def("Test, pure_virtual(&Model::Test))
;
}
我还有一个C++函数,它需要一个Model对象作为参数:
double MyFunction(Model& m) {
return m.Test()
}
现在我想在Python中创建一个派生类,重写Model::Test函数,但仍然可以传递给MyFunction。就像这样:
from mymodule import *
class NewModel(Model):
def Test(self):
return 0.5
m = NewModel()
print(MyFunction(m))
在这种情况下,我希望输出0.5。但我得到的是这个错误:
> ArgumentError: Python argument types in
> mymodule.MyFunction(NewModel) did not match C++ signature:
> MyFunction(Model {lvalue})
我不太确定我缺少了什么步骤,以至于NewModel不能在需要Model的地方使用。任何建议都非常感谢。
1 个回答
2
我需要在NewModel的初始化函数里明确地加上'Model.__init__(self)'。加上之后,它就正常工作了。