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
nomeeidade. __repr__deve retornar exatamentePessoa(nome='Alice', idade=30)para uma pessoa chamada Alice com 30 anos.__str__deve retornar exatamenteAlice (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
- Definimos a classe
Pessoacom um método__init__que armazenanomeeidade. - 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. - Implementamos
__str__com uma f-string que formata a saída amigável. - Criamos uma instância
pcom nome 'Alice' e idade 30. - Chamamos
repr(p)estr(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})"produzPessoa(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çaTypeError.
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)