Da trilha de Python Este conceito ainda não saiu como card do dia. ir para o card de hoje

Python POO Intermediário

Dataclasses

Dataclasses são uma forma concisa de criar classes que armazenam dados. Com o decorador @dataclass, o Python gera automaticamente métodos como __init__, __repr__ e __eq__, eliminando código repetitivo. Você pode personalizar campos com field, tornar a classe imutável com frozen=True e habilitar ordenação com order=True.

Para usar, basta anotar os atributos com seus tipos. O decorador cuida do resto. Isso torna o código mais limpo e legível, especialmente para classes que servem principalmente como contêineres de dados.

Além do básico, dataclasses oferecem opções avançadas: valores padrão, campos que não entram na comparação, campos calculados no pós-init, entre outros. Neste card, focamos em field, frozen e ordenação.

Pontos-chave

  • @dataclass gera automaticamente init, repr e eq.
  • field permite configurar valores padrão, exclusão de comparação e mais.
  • frozen=True torna a instância imutável após a criação.
  • order=True permite comparar e ordenar instâncias com <, >, etc.
  • Dataclasses são ideais para classes focadas em armazenar dados.
dataclasses_exemplo.py
from dataclasses import dataclass, field

@dataclass(order=True, frozen=True)
class Ponto:
    x: float
    y: float
    tags: list[str] = field(default_factory=list, compare=False)

    def distancia_origem(self) -> float:
        return (self.x**2 + self.y**2) ** 0.5

# Criando instâncias
p1 = Ponto(1.0, 2.0, ["a"])
p2 = Ponto(3.0, 4.0, ["b"])

print(p1)               # __repr__ automático
print(p1 == Ponto(1.0, 2.0, ["c"]))  # tags não afetam igualdade
print(p1 < p2)          # ordenação por x, depois y

# p1.x = 10  # Erro: frozen impede modificação

# Ordenando uma lista de pontos
pontos = [Ponto(2, 3), Ponto(1, 5), Ponto(1, 2)]
print(sorted(pontos))

Exercícios

  1. 1
    Fácil

    Criando uma dataclass simples

    Crie uma dataclass Produto com os campos nome (str) e preco (float). Em seguida, instancie dois produtos e imprima-os. Verifique se a representação automática é gerada.

    Resolver
  2. 2
    Médio

    Dataclass com field e frozen

    Crie uma dataclass Pessoa com os campos nome (str), idade (int) e tags (list[str]) que deve ter valor padrão vazio e não participar da comparação de igualdade. Torne a classe imutável (frozen). Instancie duas pessoas com as mesmas informações, mas tags diferentes, e mostre que são iguais. Tente modificar um atributo e mostre que gera erro.

    Resolver
  3. 3
    Desafio

    Ordenação com dataclass e campo calculado

    Crie uma dataclass Retangulo com campos largura (float) e altura (float). A classe deve ser ordenável (order=True) e ter um campo calculado area que não é passado no construtor, mas calculado após a inicialização (use __post_init__). O campo area não deve participar da ordenação nem da igualdade. Crie uma lista de retângulos, ordene-a e imprima. Além disso, mostre que dois retângulos com mesma largura e altura são iguais, independentemente da área (que será igual de qualquer forma).

    Resolver

Continue estudando