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.
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.
__lt__, __le__, __gt__, etc.
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__.
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.
|
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)
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)
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
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
Jorge García
Fullstack developer