Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Implementação __repr__

Olá! Fiz a implementação do repr no código para praticar, essa é a melhor forma de representar usando esse comando especial? Não entendi muito bem a vantagem de utilizá-lo. Segue o código:

class Programa:

    def __init__(self, nome, ano):
        self._nome = nome.title()
        self._ano = ano
        self._likes = 0

    def __repr__(self):
        return f'Programa(nome={self._nome}, ano={self._ano}, likes={self._likes})'

class Filme(Programa):

    def __init__(self, nome, ano, duracao):
        super().__init__(nome,ano)
        self._duracao = duracao

    def __repr__(self):
        return f'Filme(nome={self._nome}, ano={self._ano}, duracao={self._duracao}, likes={self._likes})'

class Serie(Programa):
    def __init__(self, nome, ano, temporadas):
        super().__init__(nome, ano)
        self._temporadas = temporadas

    def __repr__(self):
        return f'Serie(nome={self._nome}, ano={self._ano}, temporadas={self._temporadas}, likes={self._likes})'

vingadores = Filme("vingadores - guerra infinita", 2018, 160)
atlanta = Serie("atlanta", 2018, 2)
filmes_e_series = [vingadores, atlanta]

for programa in filmes_e_series:
    print(repr(programa))
4 respostas

O __repr__ e o __str__ funcionam parecido com algumas diferenças no propósito. Ambos pegam o objeto e convertem para sua representação em string. Tanto que caso não sobrescreva, eles retornam a implementação padrão (type e referência em memória do objeto).

O __repr__ é mais voltado para o desenvolvedor, gera um imprimível do objeto, pode servir o eval() também.

O __str__ é mais voltado para o usuário final, gera uma representação agradável para imprimir, nem sempre retorna uma string aceitável para o eval().

OBS: Só mencionei o eval() por estar na documentação, mas seu uso é considerado má prática por permitir execução de código a partir de uma string.

Link da Documentação: https://docs.python.org/3/library/functions.html#repr

Certo, mas de que forma ele ajuda o desenvolvedor? Teria outra maneira de ter utilizado o repr que coloquei no código? Outra forma de escrever que deixasse algo mais claro e assim me ajudasse de alguma outra forma?

solução!

As formas de chamar são essas:

for programa in filmes_e_series:
    print(repr(programa))
    print(programa.__repr__())
    print(programa)

O Python identifica se __repr__ ou __str__ estão implementados. Se ambos estiverem, o print(objeto) dá preferência ao __str__. Adicione o método abaixo na classe Série e o código acima substituindo o for do seu código. Você verá o print(programa) chamando o __repr__ de Filme e o __str__ de Série em vez de __repr__.

def __str__(self):
        return f'Serie com str: (nome={self._nome}, ano={self._ano}, temporadas={self._temporadas}, likes={self._likes})'

O __repr__, assim como o __str__, ajuda quando o desenvolvedor precisa ter algum retorno em terminal ou log sobre os valores do objeto. Aí faz os print(objeto) ou os except retornando o objeto como parte da mensagem de erro.

Entendi melhor como funciona, muito obrigado pela atenção e pela explicação, Pedro.