Dominando la Herencia en Python: Conceptos, Sintaxis y Ejemplos Prácticos
Herencia en Python
La herencia permite crear una nueva clase que hereda toda la funcionalidad de una clase padre mientras añade o extiende características. Este tutorial explica cómo usar herencia en Python con ejemplos claros y guía de mejores prácticas.
Video: Herencia en Python
Herencia en Python
La herencia es un principio central de la programación orientada a objetos que promueve la reutilización de código y jerarquía lógica. Una nueva clase (la derivada o hija) se define con cambios mínimos o nulos a una clase existente (la base o padre). La clase hija recibe automáticamente los atributos y métodos de su padre, que luego pueden sobrescribirse o extenderse según necesidad.
Sintaxis de Herencia en Python
class ClaseBase:
# cuerpo de la clase base
class ClaseDerivada(ClaseBase):
# cuerpo de la clase derivada
En el snippet anterior, ClaseDerivada hereda todos los miembros públicos de ClaseBase. Al añadir nuevos métodos o sobrescribir existentes, la clase derivada puede personalizar comportamiento mientras reutiliza la implementación base.
Ejemplo de Herencia en Python
Ilustremos la herencia con un ejemplo práctico. Supongamos que tenemos una clase genérica Poligono que almacena el número de lados y sus longitudes:
class Poligono:
def __init__(self, no_de_lados):
self.n = no_de_lados
self.lados = [0 for _ in range(no_de_lados)]
def input_lados(self):
self.lados = [float(input(f"Ingresa lado {i+1} : ")) for i in range(self.n)]
def display_lados(self):
for i, lado in enumerate(self.lados, 1):
print(f"Lado {i} es {lado}")
La clase Poligono encapsula atributos y métodos comunes para cualquier polígono. Un Triangulo es un polígono específico con exactamente tres lados, así que puede heredar de Poligono sin redefinir la lógica compartida:
class Triangulo(Poligono):
def __init__(self):
super().__init__(3) # inicializar base con 3 lados
def encontrar_area(self):
a, b, c = self.lados
s = (a + b + c) / 2
area = (s * (s - a) * (s - b) * (s - c)) ** 0.5
print(f"El área del triángulo es {area:.2f}")
Ejecutar lo siguiente demuestra la herencia en acción:
>>> t = Triangulo()
>>> t.input_lados()
Ingresa lado 1 : 3
Ingresa lado 2 : 5
Ingresa lado 3 : 4
>>> t.display_lados()
Lado 1 es 3.0
Lado 2 es 5.0
Lado 3 es 4.0
>>> t.encontrar_area()
El área del triángulo es 6.00
Observa que Triangulo puede llamar a input_lados() y display_lados() aunque nunca las defina —la herencia hace que estos métodos estén disponibles automáticamente.
Si un atributo o método no se encuentra en la clase hija, Python busca en la clase padre, y esta búsqueda continúa subiendo la cadena de herencia si es necesario.
Sobrescritura de Métodos en Python
Tanto Poligono como Triangulo definen un método __init__. La implementación del hijo sobrescribe la del padre, pero puede (y debe) extender la lógica base invocándola explícitamente. Usar super() es el enfoque moderno preferido:
class Triangulo(Poligono):
def __init__(self):
super().__init__(3) # llama a Poligono.__init__
Al sobrescribir, el método hijo puede añadir nuevo comportamiento o modificar el comportamiento base mientras preserva la funcionalidad original.
Python proporciona isinstance() e issubclass() para introspeccionar relaciones de herencia:
t = Triangulo()
print(isinstance(t, Triangulo)) # True
print(isinstance(t, Poligono)) # True
print(isinstance(t, int)) # False
print(isinstance(t, object)) # True
print(issubclass(Poligono, Triangulo)) # False
print(issubclass(Triangulo, Poligono)) # True
print(issubclass(bool, int)) # True
Estas utilidades son esenciales para verificación de tipos y asegurar que objetos conformen interfaces esperadas.
Para más sobre super(), ver la documentación de la función super() de Python.
python
- Herencia en C#: Construyendo código reutilizable y mantenible
- Dominando tipos de datos en Python: Guía práctica
- Dominando operadores en Python: Guía completa
- Dominando la sentencia pass en Python: Guía práctica
- Dominando Diccionarios en Python: Creación, Manipulación y Técnicas Avanzadas
- Dominando Excepciones Personalizadas en Python: Guía Práctica
- Dominando la Programación Orientada a Objetos en Python: Clases, Herencia, Encapsulación y Polimorfismo
- Dominando la Sobrecarga de Operadores en Python: Guía Práctica
- Dominando el Decorador @property de Python: Getters y Setters Limpios y Compatibles
- Entendiendo type() e isinstance() en Python: ejemplos prácticos
- Programación Orientada a Objetos en Python: Guía Completa y Práctica