Python · Sección 9

Objetos, clases y modelado

Cuándo utilizar clases, cómo construir objetos válidos y cómo relacionarlos mediante composición sin crear jerarquías innecesarias.

3
lecciones
3
ejercicios resueltos
CONTENIDO ORIGINAL

Avanza en orden. Cada lección está redactada para Palta es Cool, utiliza ejemplos propios y termina con una actividad cuya respuesta puedes desplegar.

ANTES DE EMPEZAR

Ubícate antes de avanzar

01 / PUNTO DE PARTIDA

Conviene haber comprendido Archivos, excepciones y datos externos.

02 / META OBSERVABLE

Al terminar deberías poder relacionar Clases y objetos con Dataclasses e invariantes y resolver un caso nuevo.

03 / TIEMPO SUGERIDO

Reserva entre 75 y 120 minutos o divide el laboratorio en dos sesiones.

04 / PREPARA EL LABORATORIO

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.

Ruta guiada · 3 lecciones

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.

Al terminar podrás
  • 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”
01
Clase y objeto

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.

01

La clase describe atributos y métodos compartidos.

02

self se refiere al objeto que recibe la operación.

03

__init__ establece un estado inicial válido.

Comprueba lo aprendido · 01

¿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.

02
Modelar datos

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.

01

Las anotaciones comunican los campos esperados.

02

Los valores mutables necesitan default_factory.

03

Las reglas importantes se comprueban al crear o modificar el objeto.

Comprueba lo aprendido · 02

¿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.

03
Relacionar objetos

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.

01

Pedido tiene líneas: esa relación es composición.

02

Herencia evita duplicación solo si conserva el significado del tipo base.

03

Un método corto delega responsabilidades en lugar de concentrarlas.

Comprueba lo aprendido · 03

¿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.

Resumen de la sección

Tu recorrido en tres ideas

  1. Una clase define una idea; cada objeto conserva un estado propio
  2. dataclass reduce código repetitivo, pero no reemplaza las reglas
  3. La composición expresa “tiene un”; la herencia expresa “es un”
PROFUNDIZACIÓN / LABORATORIO GUIADO

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.

CASO

Una biblioteca presta ejemplares, registra fechas y multas, y debe impedir que el mismo ejemplar quede prestado a dos personas.

Procedimiento

  1. Escribe invariantes y transiciones antes de definir clases.
  2. Asigna estado y comportamiento a Libro, Ejemplar, Persona y Prestamo.
  3. 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?

CIERRE DE LA SECCIÓN

Comprueba que puedes usarlo

Antes de continuar, revisa estos tropiezos frecuentes y resuelve un caso sin copiar los ejemplos.

ERROR 01

Crear una clase para cada sustantivo aunque solo se necesiten datos o una función.

ERROR 02

Usar herencia para reutilizar código aunque el subtipo no pueda reemplazar al tipo base.

DESAFÍO INTEGRADOR

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
Una respuesta sólida:
  • 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.