Conviene haber comprendido Archivos, excepciones y datos externos.
Avanza en orden. Cada lección está redactada para Palta es Cool, utiliza ejemplos propios y termina con una actividad cuya respuesta puedes desplegar.
Ubícate antes de avanzar
Al terminar deberías poder relacionar Clases y objetos con Dataclasses e invariantes y resolver un caso nuevo.
Reserva entre 75 y 120 minutos o divide el laboratorio en dos sesiones.
Instala Python 3 y utiliza IDLE o un editor como VS Code. Desde NumPy y Pandas trabaja dentro de un entorno virtual.
Abrir la guía de herramientas →Diagnóstico rápido: ¿cómo se relacionan Clases y objetos y Dataclasses e invariantes? +
No necesitas acertar todavía. Escribe una hipótesis de dos líneas y compárala con tu respuesta al finalizar; si puedes corregirla y justificar el cambio, hubo aprendizaje.
Aprende el tema paso a paso
Aprenderás a reconocer cuándo una clase aclara el problema, cómo se relacionan clase y objeto y por qué la composición suele ser más simple que una jerarquía innecesaria.
- Una clase define una idea; cada objeto conserva un estado propio
- dataclass reduce código repetitivo, pero no reemplaza las reglas
- La composición expresa “tiene un”; la herencia expresa “es un”
Una clase define una idea; cada objeto conserva un estado propio
Una clase reúne datos y operaciones que pertenecen al mismo concepto. Cada objeto creado a partir de ella tiene identidad y estado independientes. No todo necesita una clase: una función y un diccionario siguen siendo mejores cuando no existe un comportamiento asociado que proteger.
La clase describe atributos y métodos compartidos.
self se refiere al objeto que recibe la operación.
__init__ establece un estado inicial válido.
¿Por qué saldo pertenece a cada objeto y no debería ser una variable compartida por toda la clase?
Mostrar respuesta +
Porque cada cuenta representa un estado distinto. Si el saldo fuera compartido, depositar en una cuenta alteraría también las demás y rompería el modelo del problema.
dataclass reduce código repetitivo, pero no reemplaza las reglas
El decorador dataclass genera tareas mecánicas como el constructor y una representación legible. Es útil para registros con campos claros. Las validaciones siguen siendo responsabilidad del modelo y pueden expresarse en __post_init__ o en funciones que crean objetos válidos.
Las anotaciones comunican los campos esperados.
Los valores mutables necesitan default_factory.
Las reglas importantes se comprueban al crear o modificar el objeto.
¿Por qué no conviene escribir etiquetas: list[str] = [] como valor predeterminado?
Mostrar respuesta +
Porque esa lista sería el mismo objeto para todas las instancias. default_factory crea una lista nueva por producto y evita que modificar uno cambie accidentalmente otro.
La composición expresa “tiene un”; la herencia expresa “es un”
Componer significa que un objeto contiene o utiliza otros objetos. La herencia solo conviene cuando existe una sustitución real: el tipo especializado puede usarse donde se espera el tipo base sin romper su contrato. Para muchos programas pequeños, composición más funciones resulta más fácil de probar y cambiar.
Pedido tiene líneas: esa relación es composición.
Herencia evita duplicación solo si conserva el significado del tipo base.
Un método corto delega responsabilidades en lugar de concentrarlas.
¿Qué señal indica que una jerarquía de herencia puede estar forzada?
Mostrar respuesta +
Si la relación se explica mejor con “tiene un” o si el subtipo no puede reemplazar al tipo base sin excepciones. En esos casos, composición o funciones explícitas suelen expresar mejor el modelo.
Tu recorrido en tres ideas
- Una clase define una idea; cada objeto conserva un estado propio
- dataclass reduce código repetitivo, pero no reemplaza las reglas
- La composición expresa “tiene un”; la herencia expresa “es un”
Modela un sistema de préstamos sin estados contradictorios
Conecta reglas del dominio, estado válido, responsabilidades y composición con un diseño que pueda probarse.
Una biblioteca presta ejemplares, registra fechas y multas, y debe impedir que el mismo ejemplar quede prestado a dos personas.
Procedimiento
- Escribe invariantes y transiciones antes de definir clases.
- Asigna estado y comportamiento a Libro, Ejemplar, Persona y Prestamo.
- Prueba préstamo, devolución, duplicación y datos inválidos con objetos independientes.
Evidencia mínima
- Diagrama breve de composición.
- Invariantes comprobados al modificar estado.
- Pruebas de transiciones válidas e inválidas.
Mostrar razonamiento modelo +
Libro describe una obra; Ejemplar representa una copia prestable; Prestamo relaciona ejemplar y persona. La operación de prestar debe comprobar y cambiar el estado en una sola transición, en vez de exponer booleanos contradictorios.
Para ir más lejos¿Cómo agregarías reservas sin convertir Prestamo en una clase con demasiadas responsabilidades?
Comprueba que puedes usarlo
Antes de continuar, revisa estos tropiezos frecuentes y resuelve un caso sin copiar los ejemplos.
Crear una clase para cada sustantivo aunque solo se necesiten datos o una función.
Usar herencia para reutilizar código aunque el subtipo no pueda reemplazar al tipo base.
Ahora hazlo sin guía
Modela préstamos de una biblioteca con Libro, Persona y Prestamo, incluyendo una regla que impida devolver antes de prestar.
Mostrar pauta de corrección +
- Cada clase tiene una responsabilidad y mantiene un estado válido.
- Las relaciones usan composición cuando expresan “tiene un”.
- Prueba dos objetos independientes y una transición inválida.
