2012-01-12 15 views
5

muszę dodać nową metodę do mojego swig klasy szablonu, na przykład:Dodaj nową metodę do klasy Template Python Swig

Jestem deklarując klasę szablonu w myswig.i następująco:

%template(DoubleVector) vector<double>; 

spowoduje to wygenerowanie klasy o nazwie "DoubleVector" w wygenerowanym pliku .py z niektórymi wygenerowanymi metodami. Załóżmy, że są to func1(), func2() i func3(). Są to wygenerowane funkcje i nie mam nad nimi kontroli. Teraz, jeśli chcę dodać nową metodę o nazwie "func4()" do tej klasy (DoubleVector), jak mogę to zrobić? Czy to możliwe?

Znam identyfikator o nazwie% pythoncode, ale nie mogłem go użyć do zdefiniowania nowej funkcji w tej klasie szablonu.

+0

Zakładam, że oznaczało '% szablonu (DoubleVector) Vector ;'? – Flexo

+0

ya, przykro mi, miałem na myśli% szablon (DoubleVector) wektor ; tylko. Dzięki :) – Saurabh

Odpowiedz

9

Biorąc plik interfejs jak:

%module test 

%{ 
#include <vector> 
%} 

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

Najprostszym sposobem, aby dodać więcej funkcjonalności do DoubleVector jest pisać w C++, w pliku interfejsów SWIG użyciu %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;  
    } 
} 

ten ma zaletą, że będzie działać dla dowolnego języka, na który kierujesz się przy pomocy SWIG, a nie tylko w Pythonie.

Można również zrobić to za pomocą %pythoncode oraz unbound function:

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

DoubleVector.foo = foo 
%} 

Przykład działa następująco:

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

Sztuką jest "% wydłużać" pełną nazwę szablonu, a nie skróconą nazwę. Np. '% Extend std :: vector ', a nie '% extend DoubleVector'. –

+0

@Paul można również użyć% rozszerzenia w definicji klasy bez nazwy i odnosi się do bieżącej klasy. Biblioteka swig używa tego całkiem sporo. – Flexo

+1

Oprócz funkcji nieograniczonej, możliwe jest również zagnieżdżenie '% pythoncode' w bloku'% extend': '% extend std :: vector {% pythoncode% {def foo (self): pass %}}; ' – user1556435