Una de las particularidades o técnica del paradigma orientado a objetos es la herencia, es un concepto fácil de entender y aplicar, pero su planeación es la mas difícil y es la base de los distintos patrones de diseño. Esta vez hablaré de la herencia simple y la herencia múltiple, una característica poco común en algunos lenguajes.
Herencia.
La mayoría de los lenguajes hoy día soporta esta característica, su concepto es simple, tenemos dos clases, donde una de las clases toma todos los atributos y funciones de la otra #ClaseHija, pero la otra clase no puede tomar los atributos de la primera clase #ClasePadre, generalmente una clase especifica deriva de una clase mas general.
class FiguraGeometrica:
def __init__(self, forma):
self.forma = forma
def volumen(self):
pass
def perimetro(self):
pass
class Esfera(FiguraGeometrica):
def __init__(self, color, material)
self.color = color
self.material = material
def volumen(self)
En este ejemplo vemos como la clase esfera hereda de la clase figura geométrica, usando un par de paréntesis después del nombre de la clase, incluimos el nombre de la clase padre. Con esto podremos desde la clase esfera acceder a las funciones init, volumen, perimetro.
super().volumen() # Acceso directo
FiguraGeometrica.volumen() # Acceso indirecto
Con la palabra reservada #super, puedo acceder a las variables y métodos de la clase padre directamente, en otros lenguajes este acceso directo me permite acceder aun si el acceso de estas variables es #protegido, en Python todo es público, pero en teoría puede acceder de la misma forma.
Otra manera de acceder es de manera indirecta, usando el nombre de la clase luego de la variable o método, en teoría solo se puede acceder a aquellos datos públicos, pero no a los protegidos o privados.
La pregunta es: ¿es la clase FiguraGeometrica hija de alguna clase?. La respuesta es que todas las clases que no marcan su clase padre, heredan de la clase #object
Herencia múltiple.
Una particularidad de Python es que permite la herencia múltiple, es el mismo concepto que la herencia simple, pero podemos acceder desde una clase hija a las variables y métodos de las clases padres.
class FiguraGeometrica:
def __init__(self, forma):
self.forma = forma
def volumen(self):
pass
def perimetro(self):
pass
class Color:
def __init__(self, color):
self.color = color
class Esfera(FiguraGeometrica, Color):
def __init__(self, color, forma, material)
Color.color = color
FiguraGeometrica.forma = forma
self.material = material
def volumen(self)
En este ejemplo he incluido la clase #Color y dentro un parámetro llamado color, ahora la clase Esfera hereda de FiguraGeometrica, pero también hereda de Color.
Aunque para acceder se puede usar la palabra #super, esta palabra no especifica a que clase acceder, lo que realmente hace es que solo accede a la primera clase padre escrito en las herencias, en este caso la clase FiguraGeometrica, por eso es que la forma de acceder es de forma indirecta, escribiendo el nombre de la clase.
Esfera.mro() # Method Resolution Order
Hay un Método de clase especial llamado: #MethodResolutionOrder #MRO que sirve para mostrar el orden en que se ejecutan las herencias dentro de una clase. Este es un método de enfoque reflexivo que se usa para despejar dudas acerca de las herencias de una clase.
Conclusiones.
Personalmente no soy un experto en herencia múltiple, pues vengo del lenguaje C# donde se aplica herencia simple y creo que con la herencia simple basta para hacer muchas cosas, aún no le encuentro una ventaja clara para usar, debo admitir que mi formación autodidacta no es muy fuerte en el paradigma orientado a objetos.
Pensaba poner en este mismo post, el tema de clases abstractas y el tema de polimorfismo, pero creo que la idea se perdería, así que en un futuro le haré a estos temas un post dedicado por separado para que no se pierda el tema.
En resumen la herencia no es mas que una forma de acceder a las variables y métodos de una clase a otra pero no de la otra a la primera. La herencia múltiple simplemente amplia el acceso de una clase a varias clases y la ventaja clara que tiene la herencia en general es que restringe y canaliza el flujo de los datos manteniendo un orden.
Se puede simular lo mismo usando módulos o archivos por separado, accediendo a variables y funciones entre ellos, pero esto no deja de ser algo ingenuo y poco organizado.
No siendo mas, nos vemos en un próximo post.
Commentaires