有没有办法从python类生成一个c ++类并将其绑定到编译时?

Vai*_*urt 7 c++ python

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

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

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

    def __init__(self):
        pass
Run Code Online (Sandbox Code Playgroud)

我想要相应的c ++类:

class CarDef
{
public:
  double acceleration;
  double brake;
  double inertia;
  CarDef() 
  : acceleration( 1000.0 )
  , brake( 1500.0 )
  , inertia ( 150000.0 )
  {};
};
Run Code Online (Sandbox Code Playgroud)

生成的c ++类可能与原始的python类不同:我可以使用"getter方法"范例而不是类属性.

我想要实现的是在python中创建我能够在我的c ++应用程序中使用的资源文件.目标是尽可能减少最终用户为添加和使用参数而必须编写的代码量; 并且它必须避免在"运行阶段"期间进行字符串比较(在"初始化阶段"期间允许).

我希望用户只需输入两次资源名称:一次在python类中,一次在资源将在c ++中使用的地方,假设"魔法"将绑定两个项目(在运行时(我怀疑可以在没有字符串比较的情况下完成)或在编译时(中间步骤在编译项目之前生成c ++类)).这就是我从python到c ++的原因; 我相信从c ++到python需要至少2个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 );
Run Code Online (Sandbox Code Playgroud)

考虑到这一点,python代码严格地在c ++代码之外.

我看到的一个明显问题是如何知道python属性或方法返回的类型.我已经看过一些Cython的例子,它似乎能够使用类型(这很棒!),但我没有看到任何可以做我需要的例子.此外,c生成的代码似乎仍然需要Python.h,因此编译时需要cpython api库.

有什么办法可以实现吗?有没有更好的方法呢?

  • 我正在使用python 3.2+.
  • 我正在使用MS Visual Studio 2010(我们计划很快升级到2013).
  • 我使用的是32位系统(但我们计划很快升级到64位,操作系统和开发的软件).

whe*_*ies 1

有一种方法可以从 C++ 转到 Python,但我不知道有什么方法可以从 Python 转到 C++。如果您不介意先用 C++ 编写代码,您可以使用SWIG工具自动生成 Python 类。

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

如果您不喜欢使用 SWIG 等工具,还有用于C++ 的Boost.Python 。同样,这是用于 Python 绑定的 C++,不会从 Python 自动生成 C++。