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



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

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

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

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

这对POD很好。

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

例如,如果用户定义的类型为:

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

是否有任何方法可以动态在客户端创建一些东西(??),允许客户端检索并设置上面类中成员变量"a"的值?

我想我可以写一个简单的包装类,但如果有人能绕过它,我会很高兴。

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

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

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

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

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

https://github.com/albertz/PyCParser(不过,请注意,只支持C)。

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

BOOST中的一个库调用BOOST。Python有BOOST::Python::object::ptr,它返回一个PyObject*——这样Python就可以操作c++类了,这是你想要的吗?

最新更新