Volver a la página principal
jueves 6 febrero 2025
3

Cómo usar dataclasses.dataclass en Python

El decorador @dataclass del módulo dataclasses en Python permite definir clases de datos de manera concisa, generando automáticamente métodos como __init__, __repr__ y __eq__. Es útil para representar estructuras de datos sin necesidad de escribir código repetitivo.

¿Qué es dataclass?

El módulo dataclasses, introducido en Python 3.7, simplifica la creación de clases cuyos atributos almacenan datos. Con @dataclass, se generan automáticamente métodos como:

  • __init__: Constructor de la clase.
  • __repr__: Representación en cadena del objeto.
  • __eq__: Comparación entre objetos.
  • Otras funciones opcionales como __lt__, __le__, __gt__, etc.

Sintaxis básica

Antes de usar @dataclass, es necesario importarlo:

from dataclasses import dataclass

@dataclass
class Persona:
    nombre: str
    edad: int

Este código equivale a escribir manualmente los métodos __init__, __repr__ y __eq__.

Parámetros de dataclass

El decorador @dataclass acepta varios parámetros opcionales:

Parámetro Descripción
init (bool) Genera automáticamente __init__ (por defecto True).
repr (bool) Genera __repr__ para representación de cadena (True por defecto).
eq (bool) Genera __eq__ para comparar objetos (True por defecto).
order (bool) Genera métodos de comparación (<, <=, >, >=) si es True.
frozen (bool) Hace los objetos inmutables si es True.
slots (bool, desde Python 3.10) Usa __slots__ para optimizar memoria.

Ejemplos de uso

1. Creación y uso básico de dataclass

from dataclasses import dataclass

@dataclass
class Persona:
    nombre: str
    edad: int

p1 = Persona("Alice", 30)
p2 = Persona("Bob", 25)

print(p1)  # Persona(nombre='Alice', edad=30)
print(p1 == p2)  # False (porque los valores de los atributos son distintos)

2. Uso de valores por defecto

from dataclasses import dataclass

@dataclass
class Usuario:
    username: str
    activo: bool = True  # Valor por defecto

u1 = Usuario("admin")
print(u1)  # Usuario(username='admin', activo=True)

3. Uso de frozen=True (objetos inmutables)

from dataclasses import dataclass

@dataclass(frozen=True)
class Punto:
    x: int
    y: int

p = Punto(2, 3)
# p.x = 10  # Esto lanzará un error porque `Punto` es inmutable

4. Métodos personalizados en dataclass

from dataclasses import dataclass

@dataclass
class Rectangulo:
    ancho: float
    alto: float

    def area(self) -> float:
        return self.ancho * self.alto

r = Rectangulo(5, 10)
print(r.area())  # 50

Referencias

Etiquetas:
python
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer