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

execução errada do método da classe

Boa noite,

Estou praticando o que aprendi no curso 'Continuado com Collections' e aplicando classe junto, mas apareceu um problema que não consegui resolver.

Quando chamo a representação da string da classe, um dos metodos esta vindo antes da representação de string e não onde defini para aparecer. Poderiam me explicar o que esta causando isso e como resolver?

from collections import Counter


class ExtraiTexto:
    def __init__(self, texto):
        self.texto = texto.upper()
        self.caracteres = dict(self.conta_caracteres())
        self.total_caracteres = self.soma_total_caractere()

    def conta_caracteres(self):
        aparicoes = Counter(self.texto)

        if ' ' in aparicoes:
            aparicoes['ESPAÇO'] = aparicoes.pop(' ')
        if '\n' in aparicoes:
            del aparicoes['\n']

        return aparicoes.most_common(10)

    def soma_total_caractere(self):
        total_de_caracteres = sum(self.caracteres.values())
        return total_de_caracteres

    def visualizar_10_mais_usadas(self):
        for letra, frequencia in self.caracteres.items():
            print(letra, ' = ', frequencia)

    def __str__(self):
        return f'''
        total de caracteres: {self.total_caracteres}
        10 letras mais usadas:
        {self.visualizar_10_mais_usadas()}
        '''

    def formata_caracteres(self):
        for letra, frequencia in self.caracteres.items():
            print(f'{letra} = {frequencia} vezes')


texto3 = '''
O menino quer um burrinho
para passear.
Um burrinho manso,
que não corra nem pule,
mas que saiba conversar.

O menino quer um burrinho
que saiba dizer
o nome dos rios,
das montanhas, das flores,
– de tudo o que aparecer.

continua...
'''

contar = ExtraiTexto(texto3)
print(contar)

resultado do código:

ESPAÇO  =  31
O  =  20
R  =  19
A  =  19
E  =  18
N  =  16
U  =  15
S  =  13
M  =  10
I  =  10

        total de caracteres: 171
        10 letras mais usadas:
        None
4 respostas

Como exatamente a resultado deveria ser neste mesmo exemplo?

Minha inteção era que saisse assim:

        total de caracteres: 171
         10 letras mais usadas:
         ESPAÇO  =  31
         O  =  20
         R  =  19
         A  =  19
         E  =  18
         N  =  16
         U  =  15
         S  =  13
         M  =  10
         I  =  10
solução!

Certo, vou tentar explicar, vamos pegar a linha onde está o problema:

return f"total de caracteres: {self.total_caracteres}\n10 letras mais usadas: {self.visualizar_10_mais_usadas()}"

Seguindo pela lógica, vamos considerar que essa linha está sendo executada de trás para frente, ok?

A primeira coisa a ser executada é a função visualizar_10_mais_usadas(), que faz um loop for e PRINTA as 10 letras mais usadas na tela. (veja, aqui você já fez o compilador colocar essa informação na tela antes de tudo, e isso é que está causando o problema. E também como não está definido nenhum return nessa função, ela automaticamente retorna None)

A segunda coisa, ela pega o valor da variável total_caracteres.

A terceira coisa, a formatação de todos esses dados em uma string única com o fstring.

A quarta e última coisa é retornar essa string formatada para a variável contar que posteriormente você utiliza para printar na tela

Resultado: Uma lista impressa na tela antes do return da função str, que posteriormente retornou a string formatada com um "None" no final da string onde deveria ter retornado a lista das letras mais frequentes.

Como resolver? Não imprima nada na tela, trabalhe a lista das letras em uma variável, você já está chamando um print() no final do código colocando como parâmetro a variável contar.

No loop onde você inseriu o print() para imprimir letra = quantidade, você remove esse print() e trabalha essas strings em uma variável, no fim do loop você retorna essa variável que contém toda a lista formatada e vualá.

    def visualizar_10_mais_usadas(self):
        buff = ""
        for letra, frequencia in self.caracteres.items():
            buff = (buff + f"{letra} = {frequencia}\n")

        return buff

    def __str__(self):
        print("Dentro __str__")
        return f"total de caracteres: {self.total_caracteres}\n10 letras mais usadas: {self.visualizar_10_mais_usadas()}"

Saída:

total de caracteres: 171
10 letras mais usadas: ESPAÇO = 31
O = 20
R = 19
A = 19
E = 18
N = 16
U = 15
S = 13
M = 10
I = 10

A propósito, você não utilizou a função formata_caracteres()

Ajustei e funcionou certinho. Muito obrigado pela explição o/