尝试使用 boost::python 向 python 公开一个简单的 C++ 多态性时,我开始感到非常沮丧。
我在 C++ 中确实有以下结构:
struct Base {
int typeID;
};
struct Derived : public Base {
int derivedProperty;
}
//and some more from base derived types....
Base *returnSomethingDerivedFromBase(...) {
Derived *ret = new Derived;
ret->derivedProperty = 1234;
return ret;
}
BOOST_PYTHON_MODULE(foo)
{
class_<Base>("Base")
.add_property("baseProperty", &Base::baseProperty);
class_<Derived, bases<Base> >("Derived")
.add_property("derivedProperty", &Derived::derivedProperty);
def("returnSomethingDerivedFromBase", returnSomethingDerivedFromBase);
}
在 Python 中我只想拥有以下内容:
object = returnSomethingFromDerived() #object is of type Base
if object.typeID = 1:
#here i want to cast to Derived and access "derivedProperty"
#but this is not working :-( :
object.__class__ = Derived
有没有办法做到这一点?或者这不像在 C++ 中那样可能吗?
非常感谢您的帮助!
最佳答案
好的,我错过了 Base 类中的虚拟析构函数。所以这是它的工作原理:
struct Base {
virtual ~Base() {}
int typeID;
};
struct Derived : public Base {
int derivedProperty;
}
//and some more from base derived types....
Base *returnSomethingDerivedFromBase(...) {
Derived *ret = new Derived;
ret->derivedProperty = 1234;
return ret;
}
BOOST_PYTHON_MODULE(foo)
{
class_<Base>("Base")
.add_property("baseProperty", &Base::baseProperty);
class_<Derived, bases<Base> >("Derived")
.add_property("derivedProperty", &Derived::derivedProperty);
def("returnSomethingDerivedFromBase", returnSomethingDerivedFromBase, return_value_policy<manage_new_object>());
}
但现在我有一个不同的问题。当我尝试在元组中返回此类型时,我再次丢失了类型信息:
tuple returnSomethingDerivedFromBase(...) {
Derived *ret = new Derived;
ret->derivedProperty = 1234;
return make_tuple(ret);
}
关于python - 使用 boost python 暴露多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26522213/