POLIMORFISMO Y DUCK TYPING

AMANECE SOBRE LAS PLAYAS DEL MÉDANO, COSTA DE GRANADILLA DE ABONA, SUR DE TENERIFE.

 

      POLIMORFISMO


      Este nuevo concepto tan imbricado con la Programación Orientada a Objetos, apunta a la cualidad que comparten los objetos instanciados en clases diferentes, cada una de las cuales cuenta con un método con el mismo nombre (homonimia), de tal modo que es posible construir un método nuevo en cualquiera de ellas (también podemos hacer lo propio a partir de una superclase o clase padre como mostraremos a continuación) que, pasando como argumento a cualquier objeto que hayamos instanciado en cualquiera de las clases, obtener el resultado que esperaríamos de haberle aplicado el método homónimo en su propia clase.

Nos explicamos: imaginémonos que, en la Naturaleza, contamos con la capacidad característica al común de los seres vivos de comunicarse entre sí y con las demás especies. Sin embargo, no todos los seres vivos lo hacen de la misma manera: los seres humanos, hablan; los pájaros, pían; los gatos, maúllan; los perros, ladran; etc.



Veamos ahora cómo traducimos ésto en términos de Python:


Pues bien. Aplicando el polimorfismo podemos instanciar, por ejemplo, en la clase perros (nuestras disculpas por habernos atragantado con el PEP8 y haber escrito el nombre de las clases en minúsculas) un segundo método que llamaremos relacionarse, que llame a un objeto cualquiera instanciado en cualquiera de las clases que compartan el método comunicarse, al que le daremos el nombre de animal y que será un argumento obligatorio del método. Instanciamos el objeto en la clase y, a continuación, le asignamos nuestro método homónimo comunicarse que será al que llame en cada ocasión.

Como, antes que nada, este nuevo método ha sido instanciado dentro de la clase perro, tendremos que crear previamente un objeto de esta misma clase y, a partir de este paso previo, ya podremos aplicar el método relacionarse con cualquier objeto que queramos. Veámoslo:


Por supuesto, el que los métodos lleven el mismo nombre (homonimia) no implica necesariamente que HAGAN LO MISMO:


Una manera de soslayar la dependencia de una instanciación previa pasa por crear una superclase donde instanciar nuestro "método universal":


Visto lo básico vamos a construir a continuación un ejemplo un poco más realista (y elaborado) de polimorfismo, donde modelizamos una superclase o clase padre que efectúe un primer filtrado de la idoneidad de una cuenta de correo electrónico. A continuación, modelizamos un par de clases hijas específicas para una determinada extensión (sufijo) que es donde basamos el polimorfismo.


En 1. pasamos como argumento una cuenta de correo electrónico, cuenta, de introducción obligatoria que inicializamos directamente en el constructor/inicializador.

En 2. introducimos un condicional como filtro si la cuenta que hemos pasado no cumple con una determinada condición: que no termine con la substring que pasamos como argumento del método str.endswith(suffix). Para instanciar el sufijo debemos pasarle la autorreferencia self que liga al objeto con la clase donde ha sido instanciado.

En 3. en el caso de que el objeto exista y cumpla la condición, se instancia como es debido.

Con 4. declaramos una variable de clase a la que asignamos el sufijo que debe tener nuestro archivo dentro de esta misma clase en concreto, donde cada una de las dos clases hijas, CuentaGMAIL y CuentaPROTONMAIL Como vemos, no nos da problemas con sufijo porque éste ya fue instanciado en la clase padre o superclase.


      DUCK TYPING


      Existe en el mundo anglosajón una expresión típica, popular, parecida a nuestro castizo "blanco y en botella": si algo nada como un pato, camina como un pato y 'habla' como un pato, es un pato.

Hablando en plata, el duck typing no es otra cosa que un modelo de codificación que, en base al alto tipado dinámico que caracteriza a nuestro bienamado Python, puede prescindir de las relaciones de herencia entre superclase o clase padre y clases hijas, poniendo el foco de atención en los métodos que relacionan a unas con otras, métodos compartidos, lo que le permite obviar cualquier referencia directa a ellos, proporcionándonos una variante más sencilla e intuitiva del polimorfismo clásico.

Veamos un ejemplo basado en el supuesto anterior.


En esta ocasión, tenemos que sustituir el sufijo del método endswith() de las strings, self.sufijo, por una substring concreta, que será nuestro filtro particular, y pasar la función definida correspondiente.

IMAGEN TÍPICA DE LA COSTA NORTE DE LA ISLA DE TENERIFE.


No hay comentarios:

Publicar un comentario