Fácil Python

Criando uma dataclass simples

Enunciado

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.

Requisitos

  • Usar o decorador @dataclass
  • Definir os campos nome e preco com anotações de tipo
  • Criar duas instâncias e imprimir cada uma

Código inicial

from dataclasses import dataclass

# Defina a dataclass Produto aqui

# Crie e imprima dois produtos

Saída esperada

Produto(nome='Caneta', preco=1.5)
Produto(nome='Caderno', preco=12.0)
Ver dica

A dataclass gera automaticamente o método repr, então basta imprimir a instância.

Mostrar solução
from dataclasses import dataclass

@dataclass
class Produto:
    nome: str
    preco: float

p1 = Produto('Caneta', 1.5)
p2 = Produto('Caderno', 12.0)
print(p1)
print(p2)

Passo a passo

  1. Importamos dataclass do módulo dataclasses.
  2. Usamos o decorador @dataclass para transformar a classe Produto em uma dataclass.
  3. Declaramos os campos nome e preco com anotações de tipo (str e float).
  4. O decorador gera automaticamente __init__, __repr__ e __eq__.
  5. Criamos duas instâncias passando os valores posicionalmente.
  6. Imprimimos cada instância; o __repr__ mostra os campos de forma legível.

Por que funciona

Dataclasses são uma maneira concisa de criar classes que armazenam dados. O decorador inspeciona os atributos anotados e gera os métodos especiais, evitando código boilerplate. Assim, o foco fica na definição dos dados.

Erros comuns

  • Esquecer o decorador @dataclass: a classe não terá __init__ automático e você precisará defini-lo manualmente.
  • Não anotar os tipos: sem anotações, o decorador não reconhece os campos.
  • Usar list como valor padrão diretamente: isso causa erro porque listas são mutáveis. Use field(default_factory=list).

Outra forma de resolver

Poderia ser uma classe normal com __init__ e __repr__ manuais, mas seria mais verboso.

Saída esperada

Produto(nome='Caneta', preco=1.5)
Produto(nome='Caderno', preco=12.0)