La herencia es un concepto poderoso en la programación orientada a objetos. Es una forma de organizar el código y es especialmente útil cuando tienes varias clases relacionadas entre sí. La herencia permite que una clase herede todos los métodos y propiedades de otra clase, lo que promueve la reutilización de código y establece relaciones lógicas entre las clases.
Para demostrar el uso de la herencia en Python, consideremos un zoológico como ejemplo. Un zoológico tiene varios animales como perros, gatos y aves. Aunque estos animales tienen comportamientos únicos, también comparten algunas características comunes. En este escenario, la herencia puede ayudarnos a evitar la repetición de código y a organizar mejor el código. Veamos cómo:
class Animal: # Definición de la clase base Animal
def __init__(self, name, age): # Método constructor con parámetros name y age
self.name = name # Asignación del atributo name
self.age = age # Asignación del atributo age
def eat(self): # Método común eat
return f'{self.name} is eating.'
def make_sound(self): # Método común make_sound
return f'{self.name} makes a sound.'
class Dog(Animal): # Definición de la clase Dog que hereda de Animal
def make_sound(self): # Sobrescritura del método make_sound
return f'{self.name} barks.'
class Cat(Animal): # Definición de la clase Cat que hereda de Animal
def make_sound(self): # Sobrescritura del método make_sound
return f'{self.name} meows.'
class Bird(Animal): # Definición de la clase Bird que hereda de Animal
def eat(self): # Sobrescritura del método eat para Bird
return f'{self.name} is pecking at its food.'
def make_sound(self): # Sobrescritura del método make_sound
return f'{self.name} chirps.'
# El método __init__ se hereda de Animal
# pero también puedes definir __init__ en cualquiera de las clases heredadas
dog = Dog('Rex', 5) # Creación de una instancia de Dog
cat = Cat('Whiskers', 3) # Creación de una instancia de Cat
bird = Bird('Tweety', 2) # Creación de una instancia de Bird
for animal in [dog, cat, bird]: # Iterando sobre las instancias
print(animal.eat()) # Llamando al método heredado o sobrescrito eat
print(animal.make_sound()) # Llamando al método sobrescrito make_sound
print('-----')
El resultado sería:
Rex is eating.
Rex barks.
-----
Whiskers is eating.
Whiskers meows.
-----
Tweety is pecking at its food.
Tweety chirps.
-----
En el código anterior, Animal es la clase padre, mientras que Dog, Cat y Bird son clases hijas. Las clases hijas heredan todos los métodos de la clase Animal. Sin embargo, cada clase hija sobrescribe el método make_sound, ya que el sonido que hace cada animal es único. También sobrescribimos el método eat en la clase Bird porque la forma en que las aves comen es diferente al comportamiento general definido en la clase Animal.
Este enfoque nos permite representar objetos del mundo real y sus relaciones de manera más efectiva, creando así un código claro, conciso y fácil de mantener. La herencia nos permite disfrutar de los beneficios de la reutilización de código y la reducción de la complejidad.
Desafío: Clases Person y Employee
Se te solicita crear dos clases: Person y Employee.
La clase Person debe contener los siguientes atributos:
name: Una cadena que representa el nombre de la persona.
age: Un entero que representa la edad de la persona.
La clase Person también debe contener el siguiente método:
introduce_yourself(): Este método imprime una cadena con el siguiente formato: "My name is {name} and I am {age} years old."
La clase Employee debe heredar de la clase Person y agregar el siguiente atributo:
job_title: Una cadena que representa el puesto de trabajo de la persona.
La clase Employee también debe sobrescribir el siguiente método:
introduce_yourself(): Este método imprime una cadena con el siguiente formato: "My name is {name}, I am {age} years old, and my job title is {job_title}."