【问题标题】:Exposing polymorphism with boost python用 boost python 暴露多态性
【发布时间】:2014-10-23 06:10:27
【问题描述】:

尝试使用 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++ 中那样?

非常感谢您的帮助!!

【问题讨论】:

    标签: python c++ boost boost-python


    【解决方案1】:

    好的,我错过了 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);
    }
    

    【讨论】:

    • 如果您为新问题创建一个单独的问题,我很乐意发布一个彻底的解决方案。但是,简而言之,元组需要使用boost::python::object 构造,其中Derived 实例的所有权已转移到Python。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    相关资源
    最近更新 更多