SWIG C++;to Python:生成Python列表的子类 我使用SWIG(V3)将C++代码包到Python 3。在C++中,我有一个类 MyClass ,它继承了 STD::vector < /代码>。我想用Python来包装它,这样得到的Python类MyClass就是标准Pythonlist类的一个子类。这可能吗

SWIG C++;to Python:生成Python列表的子类 我使用SWIG(V3)将C++代码包到Python 3。在C++中,我有一个类 MyClass ,它继承了 STD::vector < /代码>。我想用Python来包装它,这样得到的Python类MyClass就是标准Pythonlist类的一个子类。这可能吗,python,c++,subclass,swig,Python,C++,Subclass,Swig,以下是一个例子: 示例.h #include <vector> #include <iostream> using namespace std; // List class class MyList : public vector<int> { public: // Init MyList() : vector<int>() { this->insert(this->

以下是一个例子:

示例.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);
        }
};
示例.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();
};
print命令返回
,但这不是我想要的。理想情况下,这应该只返回
[1,2]
,但是我仍然能够调用:

my_list.toy_insert()
print(my_list)
它应该返回
[0,1,2]


感谢您的帮助

如我在评论中所述,您可以覆盖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";
}

}

正如我在评论中提到的,您可以覆盖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";
}

}

如果您的示例按照您的意愿返回
[1,2]
,那么它将是一个Python列表,而不是
.toy\u insert()
方法。您可以覆盖
\uuuu str\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。然后它仍然是一个包装对象,您仍然可以调用
.toy\u insert()
。顺便说一句,不建议在标题中使用
。谢谢,我想这是不可能的。对于用户来说,这看起来像一个列表,但当然不会神奇地继承Python
list
类的方法-似乎没有简单的方法可以做到这一点如果您的示例按照您的意愿返回
[1,2]
,它将是一个Python列表,而没有
.toy\u insert()
方法。您可以覆盖
\uuuu str\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。然后它仍然是一个包装对象,您仍然可以调用
.toy\u insert()
。顺便说一句,不建议在标题中使用
。谢谢,我想这是不可能的。对于用户来说,这看起来像是一个列表,但当然不会神奇地继承Python
list
类的方法——似乎没有简单的方法可以做到这一点
%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