2012-03-20 4 views
2

C++로 작성된 Python 확장 모듈을 Boost.Python에서 SWIG로 이식 중입니다.SWIG를 사용하여 Python __init__ 함수에서 C++ 팩토리 메서드를 래핑하는 방법

는 C++ 코드는 정적 팩토리 메소드

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

공장 방법은 몇 가지 파생 클래스의 인스턴스에 대한 포인터를 반환과 추상 클래스 X을 정의합니다. 당신이 X::create를 호출하는

__init__(self, descr) 

방법이있는 파이썬 클래스 X에서 C++ 클래스 X을 래핑 할 수 Boost.Python으로

. 사실, 다음과 같이 수행됩니다 :

namespace bp = boost::python; 

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

SWIG와 같은 일을하는 방법이 있습니까?

+0

C++ 코드가 생성자를 사용하지 않는 이유가 있습니까? 공장 기능이 수용 할 수없는 이유로 공장 기능을 반영하는 이유가 있습니까? –

+2

factor 함수를'__init__'보다는'__new__'으로 사용하는 것이 더 적절하지 않습니까? – Marcin

+2

@ user763305 :'__new__'은 객체 생성을 제어하기 때문에 올바른 장소입니다. '__init__'는 인스턴스 상태 초기화를 제어합니다 – Daenyth

답변

1

제안 된대로 클래스 생성 방법을 제어하려면 __new__을 사용하는 것이 좋습니다. SWIG에서 다음과 같은 인터페이스 (.i) 파일을 작성해야합니다.

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