2017-03-18 6 views
0

SWIG(v3)を使用してC++コードをPython 3にラップします.C++では、std::vectorを継承するクラスMyClassがあります。これをPythonでラップして、結果のPythonクラスMyClassが標準のPython listクラスのサブクラスであるようにしたいと思います。これは可能ですか?ここSWIG C++ to Python:Pythonリストのサブクラスを生成します。

は一例であり:

example.h

#include <vector> 
#include <iostream> 

using namespace std; 

// List class 
class MyList : public vector<int> 
{ 
    public: 
     // Init 
     MyList() : vector<int>() { 
      this->insert(this->begin(),2); 
      this->insert(this->begin(),1); 
     } 

     // Toy insert function 
     void toy_insert() 
     { 
      this->insert(this->begin(),0); 
     } 
}; 

example.cpp

#include "example.h" 

example.i

%module example 

%{ 
    #include "example.h" 
%} 

%include "std_vector.i" 

using namespace std; 

%template(MyVector) std::vector<int>; // Nothing known about base class 'vector<int>' if we remove std:: here 

%typemap(out) MyList* { 
    int size = (*$1).size(); 
    $result = PyList_New(size); 

    for (int i=0; i<size; i++) { 
    PyList_SetItem($result, i, PyInt_FromLong((*$1)[i])); 
    } 
}; 

// List class 
class MyList : public std::vector<int> // Nothing known about base class 'vector<int>' if we remove std:: here 
{ 
    public: 
    MyList(); 
    void toy_insert(); 
}; 

run_example.py

import example 

my_list = example.MyList() 
print(my_list) 

印刷コマンドが返す<example.MyList; proxy of [1, 2] >が、これは私が欲しいものではありません。理想的には、これはちょうど[1,2]を返す必要がありますが、その後私はまだ呼び出すことができるでしょう:

my_list.toy_insert() 
print(my_list) 

[0,1,2]を返す必要があります。私のコメントで述べたように、あなたの助け

+1

'[1,2]'、それはPythonのリストであると '.toy_insertを(持っていません) 'メソッドを呼び出します。デフォルトの 'のプロキシです。それでもラップされたオブジェクトになり、 '.toy_insert()'を呼び出すことができます。ところで、ヘッダーに 'using'を使うのはお勧めできません。 –

+0

ありがとう、私はそれが本当に可能ではないと思う。これはユーザーのリストのようですが、もちろんPythonの 'list'クラスのメソッドを魔法のように継承するわけではありません - これは簡単な方法はないようです – Kurt

答えて

1

ため

おかげで、あなたはSWIGタイプの表示を無効にすることができます。ここでは大まかな例です:

%module x 

%{ 
#include "example.h" 
%} 

%include <windows.i> 
%include <std_vector.i> 

%template(MyVector) std::vector<int>; 

%include "example.h" 

%extend MyList { 

const char*__repr__() 
{ 
    // I was lazy. 
    return "fancy representation"; 
} 

} 

出力:あなたの例では、返された場合は、希望として

>>> import x 
>>> t=x.MyList() 
>>> t 
fancy representation 
>>> t[0] 
1 
>>> t[1] 
2 
>>> t.toy_insert() 
>>> t[0] 
0 
>>> t[1] 
1 
>>> t[2] 
2 
関連する問題