La función super() en python bien explicada y con ejemplos! -OOP

Bienvenidos a otra entrada dedicada a este maravilloso lenguaje de programacion, en este caso vamos a hablar de la función super en python 3. Siguiendo con programacion orientada a objetos como recordaras estuvimos viendo clases, herencia simple y múltiple.

Función super en python 3

Esta función nos permite invocar un método de una clase padre (primaria) desde una clase hija (secundaria) sin tener que nombrarla explícitamente. Esto nos brinda la ventaja de poder cambiar el nombre de la clase padre (primaria) cuando queramos y aún así mantener un código funcional, sencillo  y mantenible.

Ejemplo de super en python

Resultado:

Añadido el alumno Matias
[‘Matias’]

En este caso cada vez que se añada un elemento a la lista se imprimirá el elemento que se añadió porque así lo definimos (mediante un print) en la clase hija y mediante la función super logramos ejecutar el método (“append“) padre de la clase incorporada list.

Espero haber logrado explicarme correctamente. Pero sino aqui te doy lata nuevamente. El método append pertenece a la clase incorporada list (que es normalmente utilizado para añadir un elemento a una lista).

Pero nosotros logramos añadirlo a una clase hija permitiéndonos así incorporar otro comportamiento adicional que es aplicable a cualquier otra lista a la que se le asigne esta clase hija. Y aunque cambiáramos el nombre de la clase hija (en este caso Agregarelemento ) el código funcionaria igual, fijate:

 

Resultado:

Añadido el alumno Matias
[‘Matias’]

Como ves cambiamos solo el nombre de la clase y el método append funciona igual porque super en python 3  permite delegar la llamada del método directamente a la clase padre (principal o superclase) sin especificar en el la clase hija. Este es uno de los beneficios de super en la versión de python 3!

Super y Herencia múltiple en python

Aquí es donde super se vuelve emm.. “super(?)” .

En la herencia múltiple de clases es donde podemos explotar al máximo la función super. Vamos a ver otro ejemplo de herencia múltiple y cómo podemos utilizar la función super en el.

Para este ejemplo vamos a crear la siguiente estructura de clases:

Super en herencia múltiple de clases

Como ves en el gráfico (horrible pero útil) la clase Shepadoodle hereda de las clases Caniche y Pastor_Aleman que a su vez heredan de la clase principal Perros (Flechas negras para la herencia de clases). Las flechas rojas nos muestran los métodos de cada una.

Dentro de clase principal Perros tambien tenemos ladrar y grunir solo que se me olvidó incluirlo en el gráfico!

Ok listos? Ahora revisa el codigo donde en el método xladrar utilizamos la función super para multiplicar el ladrido!

 

Como ves en la explicación que inclui en los comentarios del código, si nosotros borramos o renombramos el método del cual super está heredando continuará buscando automáticamente los métodos de las clases superiores.

Ha y por cierto Shepadoodle es una mezcla de caniche y pastor aleman.

Pero porque si nosotros borramos el método “ladrar” de Caniche imprime el de Pastor_Aleman y no recurre a la clase padre Perros?

MRO (Method Resolution Order)

Porque la función super sigue un árbol de ancestros que se conoce como MRO (Method Resolution Order) que podría traducirse a Resolución de ordenes de métodos.

Como decía la función super busca siguiendo el orden (MRO) delegando en la primer clase superior por encima de la clase a la que pertenece hasta encontrar el método que estamos indicando. Y siguiendo la secuencia de MRO comienza por buscar desde la clase donde se encuentra la invocación (función super) al método, sus padres, los padres de sus padres y así hasta alcanzar la clase Object, en caso de no encontrarlo antes obviamente.

Fijate tu mismo con el código que hicimos de ejemplo de ir borrando el método de las clases padres de abajo hacia arriba y ve comprobando cómo interpreta el orden. Si pruebas cambiar el orden de las clases en:

Verás cómo prefiere el método de la clase Pastor_Aleman antes que la de Caniche.

Esto nos está diciendo que el orden de las clases, importa!

La función super nos va a permitir crear subclases que componen a otras determinando el comportamiento según el orden que le demos a las mismas.

pastor alemanjajaja

Lo siento, tenia que ponerlo!!

Descansando en la nube: login offEsto ha sido todo y espero hayas logrado comprender algo de esta función que nos va a ser muy útil en un futuro!!. Hasta luego! Bye bye! Ha y no olvides compartir, recomendarle a algún amigo interesado en python o suscribirte a mi blog! Muchas gracias por leerme 🙂