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.
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))