A menudo tienes clases que comparten mucho pero difieren en algo: un gasto normal y un gasto recurrente, un
usuario y un administrador. La HERENCIA te deja crear una clase basada en otra: la clase hija HEREDA todo lo
de la clase padre (atributos y métodos) y puede AÑADIR o CAMBIAR lo que necesite. Es reutilización al máximo:
escribes lo común una vez en el padre, y cada hija solo agrega su diferencia. Hoy dominas la herencia.
El modelo base y sus versiones
Heredar de una clase
Una clase hija se declara con class Hija(Padre): y hereda todo lo del padre:
class GastoRecurrente(Gasto): hace que GastoRecurrente herede todo de Gasto. En su __init__,
super().__init__(nombre, valor) llama al constructor del PADRE (para inicializar lo común), y luego agrega
lo suyo (self.frecuencia). El método resumen está SOBRESCRITO: la hija define su propia versión, que
además reutiliza la del padre con super().resumen(). Y isinstance(arriendo, Gasto) es True: un
GastoRecurrente ES un Gasto —tiene todo lo del padre más lo suyo—.
super() y override
En class GastoRecurrente(Gasto), ¿qué hace super().__init__() y qué significa sobrescribir un método?
Mini-reto
Extiende Mi Bolsillo con herencia: 1) una clase padre Gasto con nombre, valor y un método
resumen(); 2) una clase hija GastoConDescuento(Gasto) que agregue un descuento (porcentaje) en su
__init__ (usando super().__init__) y sobrescriba resumen() para mostrar el valor con el descuento
aplicado, reutilizando super().resumen(); 3) crea un gasto normal y uno con descuento, y muestra ambos
resúmenes. Verifica con isinstance que el hijo ES un Gasto.
Qué sigue
Ya reutilizas y especializas con herencia. La próxima lección trae algo muy pythónico: los DUNDER METHODS
(métodos "mágicos" como __str__, __eq__, __add__) que le enseñan a tus objetos a comportarse como los
tipos nativos —imprimirse bien, compararse con ==, sumarse con +—. Es lo que hace que las clases de
Python se sientan naturales.