Clases abstractas en Python con ABC y @abstractmethod
Clase 13 de 17 • Curso de Python Orientado a Objetos
Resumen
Aprende a crear clases abstractas en Python con el módulo ABC para imponer contratos claros entre clases. Con el decorador @abstractmethod, podrás exigir la sobrescritura de métodos en cada subclase, detectar errores en tiempo de ejecución y reforzar la herencia con interfaces consistentes.
¿Qué es una clase abstracta en Python con ABC?
Una clase abstracta es un contrato: define qué debe hacer una clase, no cómo hacerlo. Piensa en planos arquitectónicos que aseguran puertas y ventanas en cada edificio. Con ABC, las subclases deben implementar los métodos marcados como abstractos. A diferencia de Protocol, aquí sí hay validación en ejecución de que el método fue implementado.
¿Cómo definir UsuarioBase con @abstractmethod?
from abc import ABC, abstractmethod
class UsuarioBase(ABC):
@abstractmethod
def solicitar_libro(self):
pass
- Define el contrato base que todas las subclases deben respetar.
- Usa el decorador @abstractmethod para marcar métodos obligatorios.
- Emplea
pass
para dejar el método sin implementación.
¿Cómo heredar e implementar en una subclase?
class Usuario(UsuarioBase):
def solicitar_libro(self):
# Lógica concreta de la subclase.
...
- Hereda de UsuarioBase para reutilizar el contrato.
- Implementa el método requerido para poder instanciar la clase.
¿Qué valida Python en tiempo de ejecución?
- Si falta un método abstracto en la subclase, al instanciar se lanza TypeError.
- La verificación ocurre al ejecutar, por ejemplo:
python main.py
. - El decorador @abstractmethod es la clave de esta verificación.
¿Cómo detectar y corregir errores al faltar un método?
Al ejecutar la aplicación con python main.py
, todo funciona si las subclases implementan los métodos abstractos. Si agregas uno nuevo en la clase base, la siguiente ejecución fallará con TypeError hasta que lo implementes.
Agregar un nuevo método abstracto en la base:
from abc import ABC, abstractmethod
class UsuarioBase(ABC):
@abstractmethod
def solicitar_libro(self):
pass
@abstractmethod
def metodo_de_prueba(self):
pass
- Se declara
metodo_de_prueba
como obligatorio. - Cualquier subclase debe implementarlo antes de poder instanciarse.
Implementarlo en la subclase para resolver el error:
class Usuario(UsuarioBase):
def solicitar_libro(self):
...
def metodo_de_prueba(self):
return "Método de prueba para saber cómo funciona ABC"
- Tras implementar, la aplicación vuelve a ejecutarse con normalidad.
- El mensaje de retorno confirma el flujo correcto.
Checklist rápido.
- Ejecuta: python main.py
y verifica que todo corre.
- Agrega @abstractmethod
en la base y vuelve a ejecutar.
- Observa el TypeError que impide instanciar la subclase.
- Implementa el método faltante y prueba de nuevo.
¿Dónde conviene usar ABC y qué reto practicar?
Las clases abstractas con ABC crean contratos sólidos y aseguran interfaces consistentes entre subclases. Son especialmente útiles en frameworks y bibliotecas donde necesitas que todas las implementaciones cumplan el mismo conjunto de métodos.
Reto práctico.
- Crea una clase abstracta para el libro: LibroBase
que herede de ABC
.
- Declara con @abstractmethod todos los métodos que usan tus subclases de libro.
- Ejecuta y verifica que las subclases implementen todo lo requerido.
- Comparte tu solución en los comentarios.