如何使用SWIG将C++工厂方法封装在Python_init__函数中

How to wrap a C++ factory method in a Python __init__ function using SWIG

本文关键字:Python init 函数 封装 方法 SWIG 何使用 C++ 工厂      更新时间:2023-10-16

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

C++代码用静态工厂方法定义了一个抽象类X

class X {
public:
    static X* create(const char* descr);
    ...
};

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

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

__init__(self, descr)

方法调用CCD_ 4。事实上,它是这样做的:

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

有没有一种方法可以对SWIG做同样的事情?

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

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