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