Si alguna vez has escrito clases en Python, sabrás que definir atributos, inicializarlos en el constructor y agregar métodos como repr y eq puede ser repetitivo. Para estos casos podemos usar import dataclasses, un módulo que facilita la creación de clases al eliminar código redundante y mejorar la legibilidad.
En este artículo aprenderás qué es import dataclasses, cómo utilizarlo y cuáles son sus ventajas.
¿Qué son las dataclasses?
Supongamos que debes completar un formulario con tu nombre, dirección y número de teléfono cada vez que realizas un pedido en una tienda online. Sería tedioso escribirlo una y otra vez. Pero ¿qué pasaría si el sistema ya tuviera un formulario prellenado con tus datos y solo necesitaras cambiar lo necesario? Esta es una situación bastante recurrente cuando hacemos compras en línea, nos encontramos con que ponemos nuestro correo y aparecen los indicios de nuestros datos personales, o nos logueamos y ya los datos están cargados.
Las dataclasses en Python funcionan de manera similar: en lugar de escribir una y otra vez los métodos básicos de una clase, import dataclasses lo hace por ti de forma automática.
¿Qué es import dataclasses?
El módulo import dataclasses fue introducido en Python 3.7 y proporciona un decorador llamado dataclass que genera automáticamente métodos especiales en una clase, como:
- init para inicializar los atributos.
- repr para representar la clase como una cadena.
- eq para comparar instancias.
- Métodos de ordenación lt, le, gt y ge cuando se activan.
Esto permite definir clases de una forma más limpia y directa.
¿Cómo usar import dataclasses en Python?
- Crear una clase con dataclass: La forma más simple de usar import dataclasses es aplicar el decorador dataclass a una clase:
from dataclasses import dataclass
@dataclass
class Persona:
nombre: str
edad: int
🔴 ¿Quieres Aprender a Programar con Python? 🔴
Descubre el Full Stack Jr. Bootcamp - Aprende a Programar desde Cero de KeepCoding. La formación más completa del mercado y con empleabilidad garantizada
👉 Prueba gratis el Bootcamp Aprende a Programar desde Cero por una semanaAquí, Python genera automáticamente el método init, por lo que puedes instanciar la clase sin definirlo manualmente:
p = Persona("Juan", 30)
print(p)
Esto imprimirá algo como:
Persona(nombre='Juan', edad=30)
- Usar valores por defecto: Puedes definir valores por defecto para los atributos de la clase en import dataclasses:
@dataclass
class Persona:
nombre: str
edad: int = 18
Así, si no proporcionas un valor para edad al instanciar la clase, tomará el valor por defecto.
p = Persona("Ana")
print(p) # Persona(nombre='Ana', edad=18)
- Evitar valores mutables como valores predeterminados: Python recomienda no usar valores mutables como listas o diccionarios directamente como valores predeterminados. Para esto, dataclasses ofrece la función field:
from dataclasses import dataclass, field
@dataclass
class Persona:
nombre: str
hobbies: list = field(default_factory=list)
Sin field, todas las instancias compartirían la misma lista, lo que podría generar errores inesperados.
- Hacer una dataclass inmutable: Si deseas que los valores de una instancia no puedan modificarse después de su creación, usa el parámetro frozen:
@dataclass(frozen=True)
class Persona:
nombre: str
edad: int
Ahora, si intentas cambiar un atributo, obtendrás un error:
p = Persona("Luis", 25)
p.edad = 30 # Esto generará un error
- Comparación de objetos con dataclasses: Por defecto, las dataclasses implementan el método eq, lo que permite comparar instancias de manera sencilla:
p1 = Persona("Carlos", 40)
p2 = Persona("Carlos", 40)
print(p1 == p2) # True
Si necesitas que los objetos también se puedan ordenar, debes activar la opción order:
@dataclass(order=True)
class Producto:
nombre: str
precio: float
Ahora se pueden comparar las instancias de la clase basadas en los atributos definidos:
p1 = Producto("Laptop", 1200)
p2 = Producto("Teléfono", 800)
print(p1 > p2) # True, porque 1200 es mayor que 800
- Conversión de dataclasses a diccionarios: Para convertir una instancia de una dataclass en un diccionario, usa la función asdict:
from dataclasses import asdict
p = Persona("Elena", 35)
print(asdict(p))
Salida:
{'nombre': 'Elena', 'edad': 35}
- Usar dataclasses para herencia: Puedes crear clases que hereden de otras dataclasses sin problemas:
@dataclass
class Empleado(Persona):
salario: float
Ahora, una instancia de Empleado incluirá los atributos heredados de Persona junto con los nuevos.
e = Empleado("Marcos", 28, 2500.0)
print(e)
Salida:
Empleado(nombre='Marcos', edad=28, salario=2500.0)
Si quieres llevar tus habilidades de programación al siguiente nivel y prepararte para un futuro en tecnología, KeepCoding es el lugar perfecto para hacerlo. Con nuestro Bootcamp de programación inicial aprenderás las habilidades más demandadas del mercado y te convertirás en un profesional altamente cualificado en poco tiempo. No sigas postergando tu transformación, el mundo IT te está esperando.