La herencia
1. Qué es la herencia? #
La herencia es un concepto clave en la programación orientada a objetos que permite crear una nueva clase basada en una clase existente. La nueva clase, llamada clase hija o subclase, hereda atributos y métodos de la clase original, llamada clase padre o superclase. Esto permite reutilizar el código y extender la funcionalidad de las clases existentes.
2. Cómo funciona la herencia en Python? #
En Python, puedes crear una subclase simplemente pasando la clase padre como argumento al definir la nueva clase. La subclase hereda automáticamente todos los atributos y métodos de la clase padre, pero también puedes agregar nuevos atributos y métodos o modificar los existentes.
3. Ejemplo básico de herencia #
Vamos a ver un ejemplo de cómo funciona la herencia:
1# Clase padre 2class Animal: 3 def __init__(self, nombre): 4 self.nombre = nombre 5 6 def hacer_sonido(self): 7 print(f"{self.nombre} está haciendo un sonido.") 8 9# Clase hija que hereda de Animal 10class Perro(Animal): 11 def ladrar(self): 12 print(f"{self.nombre} está ladrando: ¡Guau, guau!") 13 14# Crear un objeto de la clase Perro 15mi_perro = Perro("Fido") 16 17# Usar métodos de la clase padre y de la clase hija 18mi_perro.hacer_sonido() # Método heredado de la clase Animal 19mi_perro.ladrar() # Método de la clase PerroSalida de consola Fido está haciendo un sonido. Fido está ladrando: ¡Guau, guau!
- ¿Qué hace este código?:
- Define una clase
Animalcon un constructor__init__que inicializa el atributonombrey un métodohacer_sonido. - Define una clase
Perroque hereda deAnimaly agrega un nuevo métodoladrar. - Se crea un objeto
mi_perrode la clasePerro. Este objeto puede usar tanto el método heredadohacer_sonidocomo el método específicoladrar.
- Define una clase
4. Sobrescribir métodos en la subclase #
Puedes sobrescribir un método de la clase padre en la subclase para cambiar su comportamiento.
1# Clase padre 2class Animal: 3 def __init__(self, nombre): 4 self.nombre = nombre 5 6 def hacer_sonido(self): 7 print(f"{self.nombre} está haciendo un sonido.") 8 9# Clase hija que sobrescribe el método hacer_sonido 10class Gato(Animal): 11 def hacer_sonido(self): 12 print(f"{self.nombre} está maullando: ¡Miau, miau!") 13 14# Crear un objeto de la clase Gato 15mi_gato = Gato("Mish") 16 17# Usar el método sobrescrito en la clase hija 18mi_gato.hacer_sonido()Salida de consola Mish está maullando: ¡Miau, miau!
- ¿Qué hace este código?:
- Define la clase
Gatoque hereda deAnimal, pero sobrescribe el métodohacer_sonidopara que el gato maúlle en lugar de hacer un sonido genérico. - Cuando se llama al método
hacer_sonidoen el objetomi_gato, se ejecuta el método sobrescrito en lugar del original.
- Define la clase
5. Llamar a métodos de la clase padre con super() #
Puedes usar la función super() en la subclase para llamar a métodos de la clase padre.
1class Animal: 2 def __init__(self, nombre): 3 self.nombre = nombre 4 5 def hacer_sonido(self): 6 print(f"{self.nombre} está haciendo un sonido.") 7 8class Perro(Animal): 9 def __init__(self, nombre, raza): 10 super().__init__(nombre) 11 self.raza = raza 12 13 def hacer_sonido(self): 14 super().hacer_sonido() 15 print(f"{self.nombre} ({self.raza}) está ladrando: ¡Guau, guau!") 16 17# Crear un objeto de la clase Perro 18mi_perro = Perro("Fido", "Labrador") 19 20# Usar el método sobrescrito que también llama al método de la clase padre 21mi_perro.hacer_sonido()Salida de consola Fido está haciendo un sonido. Fido (Labrador) está ladrando: ¡Guau, guau!
- ¿Qué hace este código?:
- La clase
Perrosobrescribe el métodohacer_sonido, pero también llama al método original de la claseAnimalusandosuper(). - El constructor de la subclase también usa
super().__init__(nombre)para inicializar el nombre utilizando el constructor de la clase padre.
- La clase
6. Por qué usar la herencia? #
La herencia es útil porque:
- Reutiliza código: Evita la duplicación al permitir que las subclases hereden código común de las clases padres.
- Organiza el código: Agrupa funcionalidad similar en clases relacionadas, haciendo que el código sea más fácil de mantener.
- Facilita la extensión: Permite agregar o modificar funcionalidades en clases existentes sin cambiar el código original.
Resumen del tema
Conceptos clave #
- Subclases y Superclases: sintaxis
class SubClase(SuperClase):para heredar métodos y atributos de la clase padre. - Sobrescritura de Métodos (Overriding): redefinir la implementación de un método en la clase hija adaptando su lógica específica.
- Uso de
super(): delegar la inicialización y llamadas a métodos originales de la clase base (super().__init__(...),super().metodo()). - Herencia Múltiple y MRO: Python permite derivar de múltiples clases resolviendo el orden de búsqueda con el algoritmo MRO (Method Resolution Order accesible mediante
Clase.__mro__).
Qué debes recordar #
La herencia permite reutilizar y extender clases mediante class Hijo(Padre): y delegar llamadas al padre usando super().