Fácil Python

Representação de uma Pessoa

Enunciado

Crie uma classe Pessoa com atributos nome e idade. Implemente __repr__ para retornar uma string no formato Pessoa(nome='Alice', idade=30) e __str__ para retornar Alice (30 anos). Teste com uma instância e imprima tanto repr() quanto str().

Requisitos

  • A classe deve ter um construtor que recebe nome e idade.
  • __repr__ deve retornar exatamente Pessoa(nome='Alice', idade=30) para uma pessoa chamada Alice com 30 anos.
  • __str__ deve retornar exatamente Alice (30 anos).
  • O programa deve imprimir as duas representações.

Código inicial

class Pessoa:
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

    # Implemente __repr__ e __str__ aqui

p = Pessoa('Alice', 30)
print(repr(p))
print(str(p))

Saída esperada

Pessoa(nome='Alice', idade=30)
Alice (30 anos)
Ver dica

Lembre-se: __repr__ é para desenvolvedores, então use aspas nos valores de string. __str__ é para usuários finais.

Mostrar solução
class Pessoa:
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

    def __repr__(self):
        return f"Pessoa(nome='{self.nome}', idade={self.idade})"

    def __str__(self):
        return f"{self.nome} ({self.idade} anos)"

p = Pessoa('Alice', 30)
print(repr(p))
print(str(p))

Passo a passo

  1. Definimos a classe Pessoa com um método __init__ que armazena nome e idade.
  2. Implementamos __repr__ usando uma f-string que inclui aspas simples ao redor do nome, seguindo a convenção de representação não ambígua.
  3. Implementamos __str__ com uma f-string que formata a saída amigável.
  4. Criamos uma instância p com nome 'Alice' e idade 30.
  5. Chamamos repr(p) e str(p) e imprimimos os resultados.

Por que funciona

O interpretador Python chama automaticamente __repr__ quando usamos repr() ou quando o objeto é inspecionado no console. __str__ é chamado por str() e por print(). Assim, ao definir esses métodos, controlamos como o objeto é representado em diferentes contextos.

Erros comuns

  • Esquecer de incluir aspas no __repr__: return f"Pessoa(nome={self.nome}, idade={self.idade})" produz Pessoa(nome=Alice, idade=30), que não é uma representação válida para recriar o objeto.
  • Confundir os dois métodos: usar __str__ para debugging pode não fornecer informações suficientes.
  • Não retornar uma string: se __repr__ retornar algo que não seja string, o Python lança TypeError.

Outra forma de resolver

Poderíamos usar !r na f-string para chamar repr() automaticamente nos atributos: return f"Pessoa(nome={self.nome!r}, idade={self.idade!r})". Isso é útil quando os atributos podem ser de tipos variados.

Saída esperada

Pessoa(nome='Alice', idade=30)
Alice (30 anos)