我试图在python中获取c ++派生类对象,但我没有在boost python中找到任何帮助。问题是,这可能是因为我可以在c ++中创建对象,并且该对象可以在python中访问。
答案 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")
/*...*/
;