如何在运行时在Boost :: Python中创建类?

时间:2016-06-15 19:18:26

标签: python c++ boost runtime boost-python

在模块源代码中创建新类我必须使用下一个声明式样式结构:

class_<MyClass>("MyClass")
    .def("my_method", &MyClass::my_method)
    .def("my_second_method", &MyClass::my_second_method);

但是如果我需要在运行时创建类?例如,模块函数将返回新类。我必须做什么?

实际上我需要动态创建新类型。在我的例子中,这种类型的固定dictonairies和类型数组。我需要这个来优化我现有的代码:开销问题。在我的项目中使用通过网络传输的数据类型。它是在运行时创建固定dict类的一个原因(每个类将存储具有指定名称的单个字段,如C ++中的结构,它是fixed dict和类型数组,其中包含此类型的数据类型和数组)。

在python代码中看起来像这样:

from MyCPPLib import DeclareFixedDictonary, DeclareTypedArray

# new used defined data type
NewClass = DeclareFixedDictonary([('field_1', int32), ('field_2', String])

# instance of this type
new_instance = NewClass(4, "Hi") 
new_instance['field_1'] = 6
new_instance['field_2'] = "qweqwe"

# ----------------------------------------------
NewArrayClass = DeclareTypedArray(NewClass)
new_array_instance = NewArrayClass([new_instance, NewClass()])

# ----------------------------------------------
NewComplexClass = DeclareFixedDictonary([('f1', float), ('f2', NewArrayClass), (f3, NewClass)])

# ... etc ...

我认为如果我使用Python :: Boost或/和Python API使用C ++创建这些功能,那么我将使用我的类型获得最大的加速。 我的问题是在运行时创建新类(通过其他函数,例如DeclareFixedDictonaryDeclareTypedArray)。

在使用Boost声明新的python类的文档后,我必须做这样的事情:

BOOST_PYTHON_MODULE(DataTypes)
{

    class_<DataTypesClass>("DataTypesClass")
        .def("set", &DataTypesClass::set)
        .def("get", &DataTypesClass::get)
        .def("set_item", &DataTypesClass::SetItem)
        .def("get_item", &DataTypesClass::GetItem)
        ;

}

但这是模块类,它们只能在我的模块中创建,而且我不能在另一个模块函数中使用class_,它会给出错误。也许Boost有API在运行时创建新类?可能是type个实例和动态填充属性。或者最好的方法是代码生成?但是比Python中的反射系统更难。

0 个答案:

没有答案