有没有办法从python类生成一个相对干净的c ++类并在编译时绑定它?
例如,如果我有这个python类:
class CarDef:
acceleration = 1000.0
brake = 1500.0
inertia = acceleration * 0.1 * brake
def __init__(self):
pass
我想拥有相应的c ++类:
class CarDef
{
public:
double acceleration;
double brake;
double inertia;
CarDef()
: acceleration( 1000.0 )
, brake( 1500.0 )
, inertia ( 150000.0 )
{};
};
生成的c ++类可能与原始的python类不同:我可以使用“getter methods”范例而不是类属性。
我想要实现的是在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 );
考虑到这一点,python代码严格地在c ++代码之外。
我看到的一个明显问题是如何知道python属性或方法返回的类型。我已经看到了Cython的一些例子,它似乎能够使用类型(这很棒!),但我没有看到任何可以做我需要的例子。此外,c生成的代码似乎仍然需要Python.h,因此编译时需要cpython api库。
我有什么办法可以做到这一点吗?有没有更好的方法呢?
答案 0 :(得分:1)
有一种从C ++到Python的方法,但我不知道从Python到C ++的任何方式。如果您不介意首先用C ++编写代码,可以使用工具SWIG自动为Python类生成。
请注意,异常处理存在一些限制。您可以设置让Python代码抛出C ++异常,但异常类型可能会在转换中丢失。您还需要注意参考计数对象的处理。 SWIG将为Python生成引用计数,有时候delete
对象会意外发生。
如果您不喜欢使用SWIG等工具,那么C ++也有Boost.Python。同样,这是用于Python绑定的C ++,并且不会从Python自动生成C ++。
答案 1 :(得分:0)
您可以在C ++代码中使用embed python,反之亦然。虽然有点难看,但是有很多辅助函数可以非常强大并且可以完成你想要的任务,但我不确定我是否完全理解你的问题。这不需要cython api,但仍然需要Python.h。
答案 2 :(得分:0)
按照你的要求做一个合乎逻辑的问题
Python的类型很弱。
在python中,甚至可以在运行时更改某个数据成员的类型
所以说你有两个类型为
CarDef
让我们称呼他们obj1
和obj2
。
假设你有一个二传手:
setIntX(self):
self.x = 5
并且假设你也有一个二传手:
setStringX(self):
self.x = "5"
那么成员x在你的C ++类中会有什么类型?
这只能在运行时决定,并且可能需要多个C ++类来建模一个python类
但是python中的模板类可能是可能的,实际上非常有趣
也许一般的解决方案是不可能的,但如果你假设没有成员有不明确的类型,那么就有可能。