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

Extract c++ derived class object in boost python

本文关键字:派生 对象 c++ 提取 boost python      更新时间:2023-10-16

我正试图在python中获取c++派生的类对象,但在boost python中找不到任何帮助。问题是,我是否可以在c++中创建对象,并且该对象在python中是可访问的。

我想我可能也遇到了同样的问题。我有一个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对象时,它也起作用。

也许这正是你所需要的。

给定

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

BOOST_PYTHON_MODULE中添加类及其方法例如

#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()

这里有详细信息

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

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