2012-01-12 8 views
5

tengo que añadir un nuevo método para mi clase de plantilla trago, por ejemplo:Añadir nuevo método de una clase de plantilla Python trago

estoy declarando una clase de plantilla en myswig.i de la siguiente manera:

%template(DoubleVector) vector<double>; 

Esto generará una clase llamada "DoubleVector" en el archivo .py generado con algunos métodos generados. supongamos que son func1(), func2() y func3(). Estas son funciones generadas y no tengo control sobre ellas. Ahora, si quiero agregar un nuevo método llamado "func4()" a esta clase (DoubleVector), ¿cómo puedo hacerlo? ¿Es posible?

Conozco un identificador llamado% pythoncode pero no pude usarlo para definir una nueva función en esta clase de plantilla.

+0

supongo que quería decir 'plantilla% (DoubleVector) vectores ;'? – Flexo

+0

ya, lo siento, quise decir% template (DoubleVector) vector ; solamente. Gracias :) – Saurabh

Respuesta

9

Dado un archivo de interfaz como:

%module test 

%{ 
#include <vector> 
%} 

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

La forma más sencilla de añadir más funcionalidad a DoubleVector es escribir en C++, en el archivo de interfaz SWIG usando %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;  
    } 
} 

esto tiene la ventaja de que funcionaría para cualquier idioma que oriente con SWIG, no solo Python.

También puede hacerlo utilizando %pythoncode y un unbound function:

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

DoubleVector.foo = foo 
%} 

Ejemplo de ejecutar este:

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

El truco es '% extender' el nombre completo de la plantilla, no el nombre abreviado. Por ejemplo, '% extender std :: vector ', no '% extender DoubleVector'. –

+0

@Paul también puede usar% extender dentro de una definición de clase sin nombre y se aplica a la clase actual. La biblioteca swig usa esto bastante. – Flexo

+1

Además de la función ilimitada, también es posible anidar el '% pythoncode' en el bloque'% extend': '% extender std :: vector {% pythoncode% {def foo (self): pass %}}; ' – user1556435

Cuestiones relacionadas