Plan de Aprendizaje Completo: Python con POO
Objetivo: Modelar un problema con objetos propios, no con diccionarios sueltos. FastAPI, Django y los modelos de SQLAlchemy son clases: si la POO está floja, el framework se memoriza y no se entiende.
Metodología: Un solo dominio (tareas de un usuario) crece en cada fase. No abras un ejemplo nuevo por cada concepto.
Tus apuntes van en Mis notas.
Avance actual: las notas propias llegan hasta la fase 4. Están en Mis notas.
Índice
- Fase 1: Clases y objetos
- Fase 2: Comportamiento y datos protegidos
- Fase 3: Herencia y composición
- Fase 4: Datos simples y contratos
- Fase 5: Un dominio que un framework puede usar
- Proyectos integradores
Fase 1: Clases y objetos
Meta: Separar el molde de los ejemplares.
-
class,__init__,selfy la diferencia entre clase e instancia - Atributos de instancia y atributos de clase, y cuál se comparte
- Métodos que leen estado y métodos que lo cambian
-
__str__y__repr__para ver el objeto en un log y no un<object at 0x...> - 🧪 Práctica:
Tareacon título, estado y un métodocerrar()que no deja cerrarla dos veces.
Fase 2: Comportamiento y datos protegidos
Meta: Que el objeto invalide los estados imposibles, no el código de afuera.
- Convención
_atributoy por qué no es seguridad real -
@propertypara leer y validar al asignar - Métodos especiales útiles:
__eq__,__len__,__iter__ - Una operación de negocio vive en el objeto, no en una función que recibe cinco dicts
- 🧪 Práctica:
Usuariocuya lista de tareas no se reemplaza desde afuera; se agregan con un método.
Fase 3: Herencia y composición
Meta: Reutilizar sin armar una jerarquía que nadie puede seguir.
- Herencia cuando hay un "es un":
TareayTareaConFecha -
super()y qué pasa si lo omites - Composición cuando hay un "tiene un": un
Proyectocontiene tareas, no hereda deTarea - Preferir composición si la jerarquía solo existe para compartir dos métodos
- 🧪 Práctica:
Proyectocon tareas dentro, y un métodoatrasadas()que no está copiado en cada tarea.
Fase 4: Datos simples y contratos
Meta: No escribir una clase larga cuando el dato es un registro.
-
@dataclasspara datos con igualdad y representación incluidas -
frozen=Truecuando el dato no debe cambiar después de crearse - Una clase abstracta pequeña (
abc) cuando varias implementaciones deben cumplir el mismo método - Tipar atributos y retornos para que el editor vea el objeto, no un
Any - 🧪 Práctica:
Tareacomo dataclass y un protocolo o clase baseRepositorioconguardarylistar.
Fase 5: Un dominio que un framework puede usar
Meta: Que la regla de negocio no importe FastAPI ni Django.
- El objeto no conoce HTTP ni la base de datos
- Una excepción de dominio (
TareaYaCerrada) en vez de unprinto un código 404 dentro de la clase - Un servicio que usa el objeto y un repositorio: la misma forma que después tendrá un endpoint
- Django models y los modelos de SQLAlchemy son el mismo oficio: estado más reglas, persistidos por otro
- 🧪 Práctica: Cerrar una tarea pasa por
Tarea.cerrar(). El servicio solo llama y traduce el error. Sin framework.
Proyectos integradores
- Dominio de tareas — usuario, proyecto y tarea, con estados válidos y excepciones propias.
- Repositorio en memoria — guarda y lista esos objetos. Más adelante FastAPI solo lo envuelve.
Recursos
| Recurso | Uso |
|---|---|
| Classes | Clases y herencia |
| dataclasses | Registros |
| abc | Contratos |
Criterios de avance
| Fase | La dominas cuando... |
|---|---|
| 1 | Creas dos tareas distintas desde la misma clase y no comparten título |
| 2 | Un estado inválido lo rechaza el objeto, no un if suelto en el script |
| 3 | Explicas por qué un proyecto contiene tareas y no hereda de ellas |
| 4 | Un dataclass congelado y un repositorio con dos métodos te alcanzan |
| 5 | La regla de cerrar una tarea no menciona HTTP |