有没有办法从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库.
有什么办法可以实现吗?有没有更好的方法呢?
有一种方法可以从 C++ 转到 Python,但我不知道有什么方法可以从 Python 转到 C++。如果您不介意先用 C++ 编写代码,您可以使用SWIG工具自动生成 Python 类。
请注意,异常处理存在一些限制。您可以设置让 Python 代码抛出 C++ 异常,但异常类型可能会在转换过程中丢失。您还需要注意引用计数对象的处理。SWIG 将为 Python 生成引用计数,有时会出现delete意外的对象。
如果您不喜欢使用 SWIG 等工具,还有用于C++ 的Boost.Python 。同样,这是用于 Python 绑定的 C++,不会从 Python 自动生成 C++。
| 归档时间: |
|
| 查看次数: |
249 次 |
| 最近记录: |