2012-01-12 8 views
5

мне нужно, чтобы добавить новый метод к моему Swig шаблонного класса, например:Добавить новый метод шаблона класса Python Swig

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

%template(DoubleVector) vector<double>; 

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

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

+0

Я предполагаю, что вы имели в виду '% шаблона (DoubleVector) вектор ;'? – Flexo

+0

ya, извините, я имел в виду% template (DoubleVector) vector ; только. Спасибо :) – Saurabh

ответ

9

Данный файл интерфейса, как:

%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 и unbound function:

%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 
>>> 
+1

Фокус в том, чтобы '% продлить 'полное имя шаблона, а не сокращенное имя. Например, '% extend std :: vector ', а не '% продлить DoubleVector'. –

+0

@Paul вы также можете использовать% extend в определении класса без имени и относится к текущему классу. Библиотека swig использует это совсем немного. – Flexo

+1

В дополнение к неограниченной функции, возможно, также можно вложить '% pythoncode' в блок'% extend': '% extend std :: vector {% pythoncode% {def foo (self): pass %}}; ' – user1556435

Смежные вопросы