Как обернуть фабричный метод C ++ в функцию Python __init__, используя SWIG - PullRequest
2 голосов
/ 20 марта 2012

Я портирую модуль расширения Python, написанный на C ++, из Boost.Python в SWIG.

Код C ++ определяет абстрактный класс X со статическим фабричным методом

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

Метод фабрики возвращает указатель на экземпляр некоторого производного класса.

С помощью 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 Ответ

1 голос
/ 29 марта 2012

Как и предполагалось, лучше использовать __new__ для управления созданием класса. В SWIG вы должны создать файл интерфейса (.i), который выглядит следующим образом:

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