IOKELU
Nivel: Avanzado – Guía 14
💡 Prueba el código:
Ejecuta cualquier ejemplo en nuestra consola interactiva: Abrir consola de Python →

Data Classes en Python

Las data classes simplifican la creación de clases que almacenan datos, generando automáticamente métodos como __init__, __repr__, __eq__ y más. En esta guía aprenderás a usar @dataclass, campos personalizados, valores por defecto, ordenación, congelación y técnicas avanzadas.

Tabla de contenidos

  • Introducción a dataclasses
  • Campos y valores por defecto
  • field()
  • Ordenación
  • Congelación (inmutables)
  • Post‑init
  • Comparación con NamedTuple
  • Ejercicios
  • Mini‑proyecto

1. Introducción a dataclasses

from dataclasses import dataclass

@dataclass
class Usuario:
    nombre: str
    edad: int

u = Usuario("Ana", 30)
print(u)

2. Campos y valores por defecto

from dataclasses import dataclass

@dataclass
class Producto:
    nombre: str
    precio: float = 0.0

p = Producto("Manzana")
print(p)

3. field()

from dataclasses import dataclass, field

@dataclass
class Carrito:
    items: list = field(default_factory=list)

c = Carrito()
c.items.append("Pan")
print(c)

4. Ordenación

from dataclasses import dataclass

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

print(Punto(1,2) < Punto(3,1))

5. Congelación (inmutables)

from dataclasses import dataclass

@dataclass(frozen=True)
class Config:
    version: str

c = Config("1.0")
# c.version = "2.0"  # Error

6. Post‑init

from dataclasses import dataclass

@dataclass
class Rectangulo:
    ancho: int
    alto: int
    area: int = 0

    def __post_init__(self):
        self.area = self.ancho * self.alto

r = Rectangulo(3, 4)
print(r.area)

7. Comparación con NamedTuple

from typing import NamedTuple

class PuntoNT(NamedTuple):
    x: int
    y: int

print(PuntoNT(1,2))

8. Ejercicios

9. Mini‑proyecto: Sistema de inventario con dataclasses

from dataclasses import dataclass, field

@dataclass
class Producto:
    nombre: str
    precio: float
    stock: int = 0

@dataclass
class Inventario:
    productos: list = field(default_factory=list)

    def agregar(self, p: Producto):
        self.productos.append(p)

    def total(self):
        return sum(p.precio * p.stock for p in self.productos)

inv = Inventario()
inv.agregar(Producto("Manzana", 1.0, 10))
inv.agregar(Producto("Pan", 0.8, 5))

print(inv.total())

Siguiente guía

Serialización avanzada →