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.
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
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
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
class Producto:
def __init__(self, nombre, precio):
self.nombre = nombre
self.precio = precio@dataclass
class Producto:
nombre: str
precio: intTransforma la clase manual en dataclass. El comportamiento visible debe seguir siendo el mismo; lo que desaparece es el código repetitivo del constructor.
Ratón 25
La salida aparecerá aquí.
Necesito una pista
- Añade
@dataclassencima de la clase. - Sustituye el
__init__por dos campos anotados:nombre: stryprecio: 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.
@dataclassahorra inicialización y representación repetitivas.- Los campos siguen perteneciendo a una clase normal: puedes añadir métodos cuando tengan sentido.
puedes mirar una clase pequeña y decidir si representa principalmente datos o si su valor está en el comportamiento que coordina.