Curso de introducción a la programación con Python

Autor: Luis Fernando Apáez Álvarez

Clase 9: Herencia múltiple (Parte I)

Primeros ejemplos

Comencemos esta sesión creando una clase para poder graficar puntos en un espacio de tres dimensiones, lo cual conseguimos escribiendo

posteriormente

Ahora bien, nos gustaría que a los puntos graficados en 3 dimensiones se les pueda calcular también la norma, entonces podemos pensar a la clase Punto3 (vista en la sesión anterior) como una subclase de Graficador3 consiguiendo así que el método graficar() sea heredado a la subclase Punto3. No obstante, recordemos que la clase Punto3 es una subclase de Punto2, de modo que, al buscar que dicha clase sea también subclase de Graficador3, estamos pensando entonces en el concepto de herencia múltiple.

Captura8.PNG

Hasta ahora, cuando trabajabamos con una superclase y subclase abordabamos el concepto de herencia simple, la cual consiste básicamente en que las subclases sólo tendrán una única superclase. Ahora bien, para trabajar con subclases que poseen más de una superclase estaremos utilizando herencia múltiple (así como indica la imagen anterior).

Para continuar recordemos el código de la superclase Punto2

y pasemos a modificar el código de la subclase Punto3 de modo que las clases Punto2 y Graficador3 sean sus respectivas superclases. Para ello

  1. Al momento de definir la subclase Punto3 pondremos como parámetros los nombres de las superclases. Es decir, en vez de escribir class Punto3(Punto2) como lo habíamos escrito en sesiones anteriores pondremos class Punto3(Punto2, Graficador3)

  2. En herencia múltiple no utilizaremos el super(). para referenciar métodos de las superclases, pues en estos casos tendremos más de una superclase en cuestión. En su lugar usaremos nombre_de_la_superclase().

veamos pues la modificación pertinente del código

luego, creamos un objeto de la clase Punto3 y vemos las característica que ha heredado de las dos superclases

con lo cual hemos conseguido el resultado que buscabamos. Para continuar abordemos otro sencillo ejemplo, donde crearemos las siguientes clases

las cuales abordan las dimensiones del ancho y altura de una figura geométrica (en la clase Figura) y el color (en la clase Color). Posteriormente crearemos la clase Cuadrado como subclase de las clase Figura y Color como sigue

donde el parámetro de lado del método __init__ de la clase Cuadrado jugará tanto en el papel del parámetro ancho como el papel del parámetro altura de la clase Figura. De tal manera

Finalmente, podemos agregar un método en la clase Cuadrado para calcular el área:

donde podemos observar que escribimos self.ancho * self.altura en vez de intentar escribir self.lado * self.lado. La razón radica en que tanto self.ancho como self.altura son atributos heredados de la clase Figura y el nombre de lado sólo hace alusión al nombre del parámetro que pasamos en el constructor de la clase Cuadrado. Además, podemos ver fácilmente que dicho constructor no posee atributos propios, por lo que, en este caso, sería totalmente erróneo pensar en self.lado. Luego

Socialmedia.PNG