如何通过Boost Python将Python派生类向上转型为其C++基类?

1 投票
1 回答
712 浏览
提问于 2025-04-18 03:10

我有一个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)'。加上之后,它就正常工作了。

撰写回答