在python中动态创建一个新类型

时间:2014-02-15 00:44:34

标签: python c++ rtti

我正在编写C ++插件,它们公开了可能属于各种类型的“属性”。简而言之,此上下文中的属性是一个变量,以及一些元数据。属性主要包含简单类型的值,如int,double,等等,但也可以是用户定义的类型/结构。

在C ++中,插件的客户端可以获取指向属性的指针,然后对其进行操作。

另一方面,从python中,简单的包装器函数可以返回一个属性值的句柄,例如:

aValue = ctypes.c_double()
getPropertyValue(handleToAProperty, ctypes.byref(aValue))

适用于POD。

但是如何处理用户定义的类型?

E.g。如果用户定义的类型是:

class myType
{
private:
    double a;
public:
    void setA(double a);
    double getA();
} 

有没有办法动态地在客户端创建(??),允许客户端检索并设置上面类中成员变量'a'的值?

我可以编写一个简单的包装类,我假设但是如果可以解决这个问题会很高兴。

2 个答案:

答案 0 :(得分:1)

类信息,甚至公共方法信息都不会自动包含在动态编译的C或C ++文件中。

C / C ++编译器知道如何验证编译文件中的公共函数,甚至执行参数/返回值类型检查,因为它们在编译时在C头文件中验证此信息

即使是Boost包装器构建器也必须导入C / C ++头文件,并且能够访问类成员等...由于在编译时获取的信息。

因此,有可能能够在正在运行的Python程序中动态地找到C / C ++数据结构和方法签名:但是你必须记住,通常这些信息甚至不在库文件中。因此,您尝试的任何方法都必须能够在程序运行时扫描头类类定义c ++文件,以便它可以执行所需的内省。

知道现在,您必须搜索解析Python模块的C ++ / C头文件,并检查它们是否适合您的需求 - 这个项目的主页确实列出了介绍性文档中的其他类似项目,所以你可能会找到一个适合你的人:

https://github.com/albertz/PyCParser(但请注意,只支持C语言。)

另一种自动公开C类的技术(sic - 它是纯C的OO框架),用于其他语言,包括Python,是gobject / gobject内省。它应该可以与Python3一起使用,但是我不知道它是否适用于C ++类,b)允许内省而不必修改类以使用gobject本身。

答案 1 :(得分:0)

BOOST中的一个库调用Boost.Python有boost :: python :: object :: ptr,它返回一个PyObject * - 这样Python可以运行c ++类,这是你想要的吗?