Middle
Quais são as semelhanças e diferenças entre dataclasses e namedtuple?
sobes.tech IA
Resposta da IA
dataclasses e namedtuple são usados para criar estruturas de dados simples, onde o objetivo principal é armazenar dados e acessá-los pelo nome.
Semelhanças:
- Permitem criar classes com campos claramente definidos.
- Fornecem acesso aos campos pelo nome (por exemplo,
obj.field). - Geram automaticamente métodos
__repr__(para uma representação de string conveniente). - Suportam desempacotamento.
Diferenças:
| Diferença | collections.namedtuple |
dataclasses.dataclass |
|---|---|---|
| Mutabilidade | Tipo imutável (immutable) | Por padrão mutável, pode ser tornado imutável (frozen=True) |
| Tipagem | Opcional, baseada em anotações de tipos | Obrigatória, baseada em anotações de tipos |
| Herança | Baseado em tupla, difícil de estender | Classes completas, suportam herança |
| Funcionalidade | Apenas armazenamento de dados, repr simples | Mais funcionalidades: __init__, __eq__, __hash__, __order__, campos com valores padrão, pós-processamento (__post_init__) |
| Versão do Python | Disponível no Python 2 e 3 | Disponível a partir do Python 3.7 |
| Sintaxe | Função que retorna uma classe | Decorador @dataclass |
Exemplos:
# namedtuple
from collections import namedtuple
PointNT = namedtuple('PointNT', ['x', 'y'])
p1 = PointNT(1, 2)
# p1.x = 10 # Causará erro, pois é imutável
print(p1)
# dataclass
from dataclasses import dataclass, field
@dataclass
class PointDC:
x: int
y: int = 0 # Campo com valor padrão
z: int = field(init=False) # Campo não inicializado automaticamente
def __post_init__(self):
self.z = self.x + self.y
p2 = PointDC(1)
print(p2)
p2.y = 5 # Mutável por padrão
print(p2)
# Para criar um dataclass imutável
@dataclass(frozen=True)
class ImmutablePoint:
x: int
y: int
p3 = ImmutablePoint(3, 4)
# p3.x = 10 # Causará erro
print(p3)