Добавить новый метод в класс Python Swig Template - PullRequest
5 голосов
/ 12 января 2012

Мне нужно добавить новый метод в мой шаблон шаблона swig, например:

Я объявляю шаблонный класс в myswig.i следующим образом:

%template(DoubleVector) vector<double>;

это создаст класс с именем "DoubleVector" в сгенерированном файле .py с некоторыми сгенерированными методами. предположим, что это func1 (), func2 () и func3 (). Это сгенерированные функции, и я не могу их контролировать. Теперь, если я хочу добавить новый метод с именем "func4 ()" в этот класс (DoubleVector), как я могу это сделать? Является ли это возможным?

Мне известен идентификатор с именем% pythoncode, но я не мог использовать его для определения новой функции в этом классе шаблона.

1 Ответ

9 голосов
/ 13 января 2012

Учитывая файл интерфейса, такой как:

%module test

%{
#include <vector>
%}

%include "std_vector.i"
%template(DoubleVector) std::vector<double>;

Самый простой способ добавить больше функциональности к DoubleVector - написать его на C ++, в файле интерфейса SWIG, используя %extend:

%extend std::vector<double> {
  void bar() {
    // don't for get to #include <iostream> where you include vector:
    std::cout << "Hello from bar" << std::endl;       
  }
}

это имеет то преимущество, что оно будет работать для любого языка, на который вы нацелены SWIG, а не только для Python.

Вы также можете сделать это, используя %pythoncode и несвязанную функцию :

%pythoncode %{
def foo (self):
        print "Hello from foo"

DoubleVector.foo = foo
%}

Пример выполнения этого:

Python 2.6.7 (r267:88850, Aug 11 2011, 12:16:10) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> d = test.DoubleVector()
>>> d.foo()
Hello from foo
>>> d.bar()
Hello from bar
>>> 
...