__str__
Quando você imprime um objeto ou o usa em logs, o Python chama o método __str__() para gerar uma representação legível. Sem ele, você vê algo como <__main__.Produto object at 0x...>, que não ajuda. Implementar __str__() permite que suas classes mostrem informações úteis diretamente, como em relatórios ou interfaces de usuário.
O PROBLEMA
Adicione __str__() a Produto(nome,preco) para exibir formatado.
SOBRE O CONCEITO
O método __str__() deve retornar uma string com a representação amigável do objeto. Ele é chamado automaticamente por print() e por str(). O erro mais comum é escrever print() dentro do método em vez de usar return — nesse caso, o método retorna None e o Python exibe o objeto como a representação padrão. Para formatar, use f-strings: return f"Produto: {self.nome} | R${self.preco}". Lembre-se: todo __str__() precisa de um return com uma string.
RESOLUÇÃO