Dataclasses no Python

Cansado de programar?

Cansado(a) de quebrar a cabeça para aprender a programar Python de verdade?

Conheça a melhor e mais completa formação de Python e Django e sinta-se um programador verdadeiramente competente. Além de Python e Django, você também vai aprender Banco de Dados, SQL, HTML, CSS, Javascript, Bootstrap e muito mais!

Quero aprender Python e Django de Verdade! Quero aprender!
Suporte

Tire suas dúvidas diretamente com o professor

Suporte

Projetos práticos voltados para o mercado de trabalho

Suporte

Formação moderna com foco na prática profissional

Download do Artigo

Atualizado para Python 3.13 (Dezembro 2025)
Conteúdo enriquecido com comparações, field() avançado e casos práticos.

Salve salve Pythonista!

Dataclasses eliminam boilerplate de classes de dados! Gera automático: __init__, __repr__, __eq__ e mais.

Neste guia, você vai aprender:

  • Menos código - __init__ automático
  • field() - Valores padrão e factory
  • frozen - Imutabilidade
  • Comparações - Dataclass vs classe normal vs NamedTuple

Neste artigo, vamos falar sobre as dataclasses no Python, uma funcionalidade introduzida na versão 3.7 da linguagem.

As dataclasses são uma forma simplificada de criar classes que armazenam dados, proporcionando uma maneira fácil e rápida de implementar classes com atributos e métodos específicos para manipulação de dados.

Vamos ver sua utilidade e como podemos definí-las no Python.

Então vamos nessa!

Vá Direto ao Assunto…

Por que utilizar dataclasses?

É comum em Python utilizarmos classes para representar estruturas de dados, como por exemplo, um usuário com nome, idade e email.

Para criar essa classe, precisamos definir os atributos, o método construtor, métodos e outras funcionalidades específicas.

Isso pode ser um pouco trabalhoso e propenso a erros.

As dataclasses surgem como uma solução para tornar esse processo de criação de classes para armazenamento de dados mais simples, reduzindo a quantidade de código necessário.

Com as dataclasses, podemos criar essas classes de forma mais declarativa e legível, concentrando apenas na definição dos atributos e deixando o Python gerar o código necessário automaticamente.

Como utilizar dataclasses

Para usar as dataclasses, precisamos importar o módulo dataclasses.

Vamos começar criando uma classe simples que representa um usuário:

1
2
3
4
5
6
7
import dataclasses

@dataclasses.dataclass
class Usuario:
    nome: str
    idade: int
    email: str

Essa classe é decorada com o @dataclasses.dataclass, indicando que queremos utilizar a funcionalidade de dataclass do Python.

Em seguida, declaramos os atributos da classe, junto com os seus tipos.

A partir desse momento, o Python já faz automaticamente algumas coisas para nós:

  • Cria um método construtor que recebe os valores dos atributos e atribui esses valores aos atributos correspondentes;
  • Cria métodos getters e setters para cada atributo;
  • Implementa os métodos especiais __repr__ e __eq__ para exibição amigável do objeto e comparação de igualdade, respectivamente.

Agora, podemos criar objetos dessa classe e acessar seus atributos da seguinte forma, assim como fazemos com classes comuns:

1
2
3
4
5
usuario1 = Usuario("João", 25, "[email protected]")

print(usuario1.nome)
print(usuario1.idade)
print(usuario1.email)

Ao executar esse código, teremos a seguinte saída:

1
2
3
João
25
[email protected]

Podemos também modificar os valores dos atributos:

1
2
3
4
5
6
7
usuario1.nome = "Maria"
usuario1.idade = 30
usuario1.email = "[email protected]"

print(usuario1.nome)
print(usuario1.idade)
print(usuario1.email)

Agora teremos a seguinte saída:

1
2
3
Maria
30
[email protected]

Como podemos perceber, o Python nos permite trabalhar facilmente com as dataclasses, tanto na criação quanto na modificação dos valores dos atributos.

:bulb: Estou desenvolvendo o DevBook, uma plataforma que usa IA para gerar ebooks técnicos profissionais. Depois de ler, dá uma passada no site!

Atributos opcionais e valores padrão

Em algumas situações, pode ser necessário definir atributos opcionais em nossas dataclasses.

Para isso, basta definir o valor padrão como None ou algum outro valor desejado:

1
2
3
4
5
@dataclasses.dataclass
class Usuario:
    nome: str
    idade: int = 0
    email: str = None

Agora podemos criar objetos da classe Usuario sem fornecer todos os atributos:

1
2
3
4
5
6
7
8
9
10
usuario1 = Usuario("João")
usuario2 = Usuario("Maria", 30)

print(usuario1.nome)
print(usuario1.idade)
print(usuario1.email)

print(usuario2.nome)
print(usuario2.idade)
print(usuario2.email)

A saída será:

1
2
3
4
5
6
João
0
None
Maria
30
None

Dessa forma, podemos criar objetos da classe Usuario com diferentes combinações de atributos obrigatórios e opcionais.

Está curtindo esse conteúdo? :thumbsup:

Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?

Sua assinatura não pôde ser validada.
Você fez sua assinatura com sucesso.

Assine as PyDicas e receba 30 dias do melhor conteúdo Python na sua Caixa de Entrada: direto e sem enrolação!

Métodos personalizados

Além de gerar automaticamente os métodos getters e setters, as dataclasses nos permitem implementar os nossos próprios métodos personalizados.

Esses métodos podem ser implementados normalmente, como em qualquer outra classe.

Vamos adicionar um método saudacao à nossa classe Usuario, que retorna uma saudação personalizada com nome e idade do usuário:

1
2
3
4
5
6
7
8
@dataclasses.dataclass
class Usuario:
    nome: str
    idade: int = 0
    email: str = None
    
    def saudacao(self):
        return f"Olá, meu nome é {self.nome} e tenho {self.idade} anos."

Agora podemos invocar esse método em um objeto da classe Usuario:

1
2
3
4
5
usuario1 = Usuario("João", 25)
usuario2 = Usuario("Maria", 30)

print(usuario1.saudacao())
print(usuario2.saudacao())

A saída será:

1
2
Olá, meu nome é João e tenho 25 anos.
Olá, meu nome é Maria e tenho 30 anos.

Podemos adicionar quantos métodos desejarmos às nossas dataclasses, tornando-as mais ricas em funcionalidades de acordo com as necessidades da nossa aplicação.

Comparação de objetos

Ao criar uma dataclass, o Python automaticamente implementa o método especial __eq__ para realizar a comparação de igualdade entre objetos.

Esse método compara os valores dos atributos das instâncias, garantindo que dois objetos sejam considerados iguais se seus atributos tiverem os mesmos valores.

1
2
3
4
5
6
usuario1 = Usuario("João", 25, "[email protected]")
usuario2 = Usuario("Maria", 30, "[email protected]")
usuario3 = Usuario("João", 25, "[email protected]")

print(usuario1 == usuario2)
print(usuario1 == usuario3)

A saída será:

1
2
False
True

Como podemos observar, a comparação usuario1 == usuario2 retorna False, pois os valores dos atributos são diferentes, enquanto a comparação usuario1 == usuario3 retorna True, uma vez que os objetos têm os mesmos valores para os atributos.

Dataclass vs Classe Normal vs NamedTuple

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from dataclasses import dataclass
from typing import NamedTuple

# Classe Normal: Muito boilerplate
class PessoaNormal:
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade
    
    def __repr__(self):
        return f"PessoaNormal(nome='{self.nome}', idade={self.idade})"
    
    def __eq__(self, other):
        return self.nome == other.nome and self.idade == other.idade

# Dataclass: Automático!
@dataclass
class PessoaData:
    nome: str
    idade: int

# NamedTuple: Imutável
class PessoaTuple(NamedTuple):
    nome: str
    idade: int

Comparação

Feature Classe Normal Dataclass NamedTuple
Boilerplate ❌ Alto ✅ Mínimo ✅ Mínimo
Mutável ✅ Sim ✅ Sim (default) ❌ Não
Type hints ✅ Opcional ✅ Obrigatório ✅ Obrigatório
__repr__ ❌ Manual ✅ Auto ✅ Auto
__eq__ ❌ Manual ✅ Auto ✅ Auto
Valores padrão ✅ Sim ✅ Sim ✅ Sim
Herança ✅ Sim ✅ Sim ❌ Não

Quando Usar Cada Um?

Use Dataclass quando:

  • Precisa armazenar dados estruturados
  • Quer menos boilerplate
  • Dados são mutáveis
  • Precisa métodos customizados

Use NamedTuple quando:

  • Dados são imutáveis
  • Precisa usar como chave de dict
  • Leve e rápido (performance)
  • Não precisa herança

Use Classe Normal quando:

  • Lógica complexa
  • Não é apenas armazenamento
  • Precisa controle total

Casos Práticos

1. Configuração de App

1
2
3
4
5
6
7
8
9
10
11
12
13
from dataclasses import dataclass, field

@dataclass
class AppConfig:
    host: str = "localhost"
    port: int = 8000
    debug: bool = False
    allowed_hosts: list = field(default_factory=list)
    
config = AppConfig()
print(config)  # AppConfig(host='localhost', port=8000, ...)

config_prod = AppConfig(host="0.0.0.0", port=80, allowed_hosts=['example.com'])

2. Data Transfer Object (DTO)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from dataclasses import dataclass, asdict
import json

@dataclass
class UserDTO:
    id: int
    username: str
    email: str
    active: bool = True

user = UserDTO(1, "alice", "[email protected]")

# Converter para dict
user_dict = asdict(user)
print(user_dict)

# Serializar para JSON
json_data = json.dumps(asdict(user))
print(json_data)  # {"id": 1, "username": "alice", ...}

3. Dados Imutáveis (frozen)

1
2
3
4
5
6
7
8
9
10
11
12
from dataclasses import dataclass

@dataclass(frozen=True)  # Imutável!
class Coordenada:
    x: float
    y: float

coord = Coordenada(10.5, 20.3)
# coord.x = 15  # ❌ Erro! frozen=True

# Pode usar como chave de dict
cache = {coord: "valor"}

Conclusão

Neste guia de Dataclasses, você aprendeu:

Menos boilerplate - __init__, __repr__, __eq__ automáticos
field() - Valores padrão com factory
frozen - Imutabilidade
asdict()/astuple() - Conversão
Comparações - Dataclass vs Normal vs NamedTuple

Principais lições:

  • Dataclasses eliminam boilerplate de classes de dados
  • Use field(default_factory=list) para valores mutáveis
  • frozen=True torna instâncias imutáveis
  • order=True adiciona __lt__, __le__, etc.
  • NamedTuple para dados imutáveis simples

Próximos passos:

  • Pratique @property com dataclasses
  • Explore field(init=False) e field(repr=False)
  • Aprenda Pydantic para validação avançada
  • Estude attrs (alternativa a dataclasses)

As dataclasses são uma adição muito útil ao Python para simplificar a criação de classes de armazenamento de dados.

Neste artigo, vimos como utilizar dataclasses no Python, declarando os atributos das classes e aproveitando todas as funcionalidades geradas automaticamente.

Além disso, exploramos a criação de atributos opcionais, valores padrão, métodos personalizados e a comparação de igualdade entre objetos.

As dataclasses são uma ferramenta poderosa e muito útil para desenvolvimento em Python, tornando o código mais limpo, legível e produtivo.

Espero que este artigo tenha sido útil para você entender o que são as dataclasses no Python e como utilizá-las em suas aplicações.

Experimente utilizar dataclasses em seus projetos e desfrute de toda a praticidade e produtividade que elas oferecem.

Até a próxima! :wave:

Nos vemos no próximo Artigo aqui do Blog!

Começe agora sua Jornada na Programação!

Não deixe para amanhã o sucesso que você pode começar a construir hoje!

#newsletter Olá :wave: Curtiu o artigo? Então faça parte da nossa Newsletter! Privacidade Não se preocupe, respeitamos sua privacidade. Você pode se descadastrar a qualquer momento.