有没有办法从python类生成c++类并在编译时绑定它?

2024-09-24 16:34:56 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法从python类生成一个相对干净的c++类并在编译时绑定它?在

例如,如果我有这个python类:

class CarDef:
    acceleration = 1000.0
    brake = 1500.0
    inertia = acceleration * 0.1 * brake

    def __init__(self):
        pass

我想要相应的c++类:

^{pr2}$

生成的c++类和原始的python类可能不同:我可以使用“getter方法”范式而不是类属性。在

我试图实现的是用python创建资源文件,以便在c++应用程序中使用。目标是尽可能减少最终用户添加和使用参数所需的代码量;并且必须避免在“运行阶段”(在“初始化阶段”允许这样做)期间进行字符串比较。在

我希望用户只需输入两次资源名称:一次是在python类中,一次是在c++中将要使用资源的地方,假设“魔力”将绑定这两个项(要么在运行时(我怀疑没有字符串比较就可以做到这一点),要么在编译时(中间步骤在编译项目之前生成c++类)。这就是为什么我要从python转到c++;我相信从c++到python至少需要两个python文件:一个是生成的,一个是从后者继承的(以避免覆盖已经指定的资源)。在

最终用户的用途如下:

// A singleton definition manager
class DefManager
{
  CarDef mCarDef;
public:
  static DefManager& GetReference() 
  {
    static DefManager instance;
    return instance;
  }

  CarDef& getCarDef() { return mCarDef; }
};

// One would use the generated CarDef class like this:
mCar.setSpeed( mCar.getSpeed() +  DefManager.GetReference().getCarDef().acceleration );

考虑到这一点,python代码完全在c++代码之外。在

我看到的一个明显的问题是如何知道python属性或方法返回的类型。我看到了一些例子,太好了!,但我还没有看到任何能满足我需要的例子。另外,在编译时,c生成的代码似乎仍然需要Python.h和cpythonapi库。在

我有什么办法可以做到这一点吗?有更好的方法吗?在

  • 我使用的是python3.2+。在
  • 我正在使用微软的visualstudio2010(我们计划很快升级到2013年)。在
  • 我使用的是32位系统(但我们计划很快升级到64位,操作系统和开发的软件)。在

Tags: 文件方法字符串代码属性static资源阶段
3条回答

您可以在C++代码中使用{a1}python,反之亦然。有很多助手函数,虽然有点难看,但功能非常强大,可能能够完成您想要的,尽管我不确定我是否完全理解您的问题。这不需要cythonapi,但仍然需要Python.h

<>有一种方法可以从C++到Python,但是我不知道从Python到C++的任何方式。如果你不介意先用C++编写代码,你可以使用工具SWIG为你的python类自动生成。在

请注意,异常处理有一些限制。您可以设置让您的Python代码抛出C++异常,但是异常类型可能在翻译中丢失。您还需要注意对引用计数对象的处理。SWIG将为Python生成引用计数,这有时会意外地生成delete对象。在

如果你不喜欢使用一个工具,比如SWIG,那么C++也有{a2}。同样,这是Python绑定的C++,不从Python自动生成C++。在

按照你的要求去做是有逻辑问题的。
Python是弱类型的。
在python中,甚至可以在运行时更改某个数据成员的类型。
假设你有两个类型的对象

CarDef

我们把它们称为obj1obj2。 假设你有一个setter:

^{pr2}$

假设你也有一个setter:

setStringX(self): 
    self.x = "5"

那么C++中的成员X有什么类型呢?
这只能在运行时决定,并且一个Python类可能需要一个以上的C++类。 不过,从python中创建一个模板类是可能的,而且实际上非常有趣。
另外,一个通用的解决方案可能是不可能的,但如果您假设没有成员具有不明确的类型,这是可能的。在

相关问题 更多 >