3
respostas

__repr__ou __str__

Criei um objeto User:

class User():
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __lt__(self, other):
        return self.age < other.age
    def __str__(self):
        return f"Idade: {self.age}"

user1 = User("john", 22)
user2 = User("peter", 22)

Se eu imprimir user1:

print(user1)

da certo. Mas se eu criar uma lista com meus objetos, não consigo imprimir:

list = [user1, user2]
print(list)

O resultado é: [<main.User object at 0x0000016DA34FD0C0>, <main.User object at 0x0000016DA397EBC0>] Precisei adicionar repr para funcionar. Mas por que só consigo dar print na lista com repr e não str?

3 respostas

Boa tarde, Bianca.

É necessario a utilização de um for para percorrer a lista([]), assim imprimindo um usuario de cada vez.

Exemplo:

class User():
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __lt__(self, other):
        return self.age < other.age
    def __str__(self):
        return f"Idade: {self.age}"

user1 = User("john", 22)
user2 = User("peter", 22)

print(user1)
list = [user1, user2]

for unidade in list:
    print(unidade)

Espero ter ajudado.

Oi, Bruno! Acho que você acabou não respondendo minha pergunta, eu consegui fazer imprimir a lista até sem precisar do FOR, foi apenas inserir o metodo de repr no meu objeto. Minha pergunta é "por que"? Por que a lista só é impressa com o método repr e não str?

Bom dia, Bianca!

Achei muito interessante sua dúvida e decidi pesquisar a respeito. A resposta que encontrei foi que o print() chama o método __str__ dos objetos, tanto os que criamos quanto os built-in, mas, quando fazemos uma lista, ela chama o método __repr__ para imprimir e não o __str__ como quando usamos o print para cada um individualmente. Por isso que só conseguimos imprimir a representação que queremos em listas da maneira como você fez para dar certo, ou com o for como sugerido pelo Bruno.

O for funciona justamente porque irá chamar o print() para cada objeto da lista individualmente, imprimindo a representação correta de cada um.

Espero ter ajudado com sua duvída. Bons estudos! :)