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,2]'、それはPythonのリストであると '.toy_insertを(持っていません) 'メソッドを呼び出します。デフォルトの 'のプロキシです。それでもラップされたオブジェクトになり、 '.toy_insert()'を呼び出すことができます。ところで、ヘッダーに 'using'を使うのはお勧めできません。 –
ありがとう、私はそれが本当に可能ではないと思う。これはユーザーのリストのようですが、もちろんPythonの 'list'クラスのメソッドを魔法のように継承するわけではありません - これは簡単な方法はないようです – Kurt