2012-03-20 6 views
2

C++で書かれたPython拡張モジュールをBoost.PythonからSWIGに移植します。SWIGを使ってPython __init__関数でC++ファクトリメソッドをラップする方法

C++コードは、静的ファクトリメソッド

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

と抽象クラスXを定義ファクトリメソッドは、いくつかの派生クラスのインスタンスへのポインタを返します。 Boost.Pythonで

あなたはX::createを呼び出し

__init__(self, descr) 

メソッドを持つPythonクラスXにC++クラスXをラップすることができます。実際には、次のように行われます。

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); } 
}; 
関連する問題