Lección 32 de 45 · Módulos y orientación a objetos

Dataclasses

Cuando una clase existe sobre todo para guardar datos, una dataclass puede quitarte código mecánico sin ocultar lo importante.

DatosEliminar repetición mecánicaDefaults
Índice · Lección 32/45
Una dataclass no cambia el significado de una clase: elimina trabajo repetitivo

Imagina una clase Libro cuyo trabajo principal es guardar titulo, autor y paginas. Escribir a mano un __init__ que solo copia esos tres valores aporta poco aprendizaje y mucho ruido.

@dataclass permite declarar los campos y deja que Python genere ese código rutinario.

Evidencia de aprendizaje

Reconocer qué código mecánico puede generar @dataclass sin ocultar el significado de los datos.

Primero mira el código que ya no necesitas escribir

Tres campos describen la estructura del objeto
from dataclasses import dataclass

@dataclass
class Libro:
    titulo: str
    autor: str
    paginas: int

libro = Libro("Python claro", "Ada", 240)
print(libro)

Las anotaciones indican qué campos tiene el objeto. A partir de ellas, la dataclass genera un inicializador y una representación legible.

Los tipos siguen siendo ayudas para personas y herramientas; @dataclass no convierte automáticamente Python en un lenguaje de tipos estrictos.

Los valores por defecto van después de los campos obligatorios

Un campo opcional puede tener un valor inicial
from dataclasses import dataclass

@dataclass
class Tarea:
    titulo: str
    prioridad: int = 1
    completada: bool = False

tarea = Tarea("Repasar listas")
print(tarea.prioridad, tarea.completada)

titulo es obligatorio. Los otros campos ya tienen un valor razonable si no indicas nada al crear la instancia.

Lee la firma de izquierda a derecha: primero los datos que siempre debes proporcionar; después los que pueden usar un valor por defecto.

Ampliación: defaults mutables

Si una dataclass necesita una lista nueva por instancia, se usa field(default_factory=list). Este detalle importa cuando llegues a objetos con colecciones mutables, pero no es necesario para entender por qué existe @dataclass.

from dataclasses import dataclass, field

@dataclass
class Curso:
    nombre: str
    alumnos: list[str] = field(default_factory=list)

Quita código mecánico sin perder significado

Clase manual
class Producto:
    def __init__(self, nombre, precio):
        self.nombre = nombre
        self.precio = precio
Mismo dato, menos ruido
@dataclass
class Producto:
    nombre: str
    precio: int

Transforma la clase manual en dataclass. El comportamiento visible debe seguir siendo el mismo; lo que desaparece es el código repetitivo del constructor.

Salida esperada
Ratón 25
dataclass.py
La salida aparecerá aquí.

Necesito una pista
  • Añade @dataclass encima de la clase.
  • Sustituye el __init__ por dos campos anotados: nombre: str y precio: int.
Ver una solución razonada
from dataclasses import dataclass

@dataclass
class Producto:
    nombre: str
    precio: int

producto = Producto("Ratón", 25)
print(producto.nombre, producto.precio)

No conviertas automáticamente cada clase en una dataclass

Una dataclass brilla cuando el objeto se entiende principalmente por sus datos. Si una clase existe para coordinar procesos, esconder mucha lógica o controlar cuidadosamente cómo se crea, una clase normal puede expresar mejor la intención.

  • @dataclass ahorra inicialización y representación repetitivas.
  • Los campos siguen perteneciendo a una clase normal: puedes añadir métodos cuando tengan sentido.
Puedes continuar si...

puedes mirar una clase pequeña y decidir si representa principalmente datos o si su valor está en el comportamiento que coordina.