如何使用SWIG在Python __init__函数中包装C ++工厂方法

时间:2012-03-20 16:20:07

标签: c++ python swig

我正在将用C ++编写的Python扩展模块从Boost.Python移植到SWIG。

C ++代码使用静态工厂方法

定义抽象类X
class X {
public:
    static X* create(const char* descr);
    ...
};

factory方法返回指向某个派生类的实例的指针。

使用Boost.Python,您可以将C ++类X包装在具有

的Python类X
__init__(self, descr)

调用X::create的方法。事实上,它完成如下:

namespace bp = boost::python;

bp::class_<X>("X", boost::no_init)
    .def("__init__", bp::make_constructor(&X::create))
    ...

有没有办法用SWIG做同样的事情?

1 个答案:

答案 0 :(得分:1)

根据建议,最好使用__new__来控制类的创建方式。在SWIG中,您应该创建一个如下所示的接口(.i)文件:

%extend X {
  static X * __new__(const char *desc) { return create(desc); }
};