在boost python中提取c ++派生类对象

时间:2013-12-04 12:37:32

标签: c++ boost-python

我试图在python中获取c ++派生类对象,但我没有在boost python中找到任何帮助。问题是,这可能是因为我可以在c ++中创建对象,并且该对象可以在python中访问。

2 个答案:

答案 0 :(得分:1)

我想我也许有同样的问题。 我有一个Base类和一个Derived类,既具体又暴露给python。

class Base
{
public:
    virtual ~Base() {}
};

class Derived : public Base
{};

BOOST_PYTHON_MODULE(inheritance)
{
    boost::python::class_<Base>("Base") ;
    boost::python::class_<Derived, boost::python::bases<Base> >("Derived") ;
}   

然后我将Derived类的实例视为Base引用并尝试将其传递给具有正确转换类型的python。

int main()
{
    Py_Initialize();
    initinheritance() ;

    boost::python::api::object main_module = boost::python::import("__main__");
    boost::python::api::object main_namespace = main_module.attr("__dict__");

    Derived derived ;
    const Base& base = derived ;

    // argh: 'base' is seen as python 'Base' class instance
    main_namespace["base"] = base ; 
    boost::python::exec("print base",main_namespace) ;

    // python 'var' is seen as python 'Derived' class instance 
    // when using C++ pointer and boost::python::ptr 
    main_namespace["var"] = boost::python::ptr(&base) ; 
    boost::python::exec("print var",main_namespace) ;


    Py_Finalize();

    return 0;
}

执行打印:

<inheritance.Base object at 0x0042CC70>
<inheritance.Derived object at 0x0042CC38>

我必须使用boost::python::ptr和C ++指针。 当Base*指向真实的Base对象时,它也有效。

也许这就是你需要的。

答案 1 :(得分:0)

鉴于

class MyClass
{
public:
    void some_method();
};

BOOST_PYTHON_MODULE添加您的课程及其方法 e.g。

#include <boost/python.hpp>
using namespace boost::python;

BOOST_PYTHON_MODULE(test)
{
    class_<MyNamespace::MyClass>("MyClass") 
        .def("some_method", &MyNamespace::MyClass::some_method)
    ;  
}

然后在python中调用它们

import test
myClass = test.MyClass()
myClass.some_method()

有详细信息here

如果你想要基类和派生类,你可以这样做:

class_<Base>("Base")
/*...*/
;

class_<Derived, bases<Base> >("Derived")
/*...*/
;