1
resposta

Verifique porque está saindo aparecendo None no lugar do número.

class Impressao(object):
    def Visita_soma(self, soma):
        #visitar expressão da esquerda.
        #print (soma.expressao_esquerda.aceita(self))
        #print(soma.expressao_direita.aceita(self))

        print('( %s + %s )' %(soma.expressao_esquerda.aceita(self), soma.expressao_direita.aceita(self)))

    def Visita_subtracao(self, subtracao):
       # visitar expressão da esquerda.
       #print(subtracao.expressao_esquerda.aceita(self))
       #print(subtracao.expressao_direita.aceita(self))

       print ('( %s - %s )' %(subtracao.expressao_esquerda.aceita(self), subtracao.expressao_direita.aceita(self)))

    def Visita_multiplicacao(self, multiplica):
        # visitar expressão da esquerda.
        #print(multiplica.expressao_esquerda.aceita(self))
        #print(multiplica.expressao_direita.aceita(self))

        print('( %s * %s )' %(multiplica.expressao_esquerda.aceita(self), multiplica.expressao_direita.aceita(self)))

    def Visita_divisao(self, divisao):
        # visitar expressão da esquerda.
        #print(divisao.expressao_esquerda.aceita(self))
        #print(divisao.expressao_direita.aceita(self))

        print('( %s / %s )' %(divisao.expressao_esquerda.aceita(self), divisao.expressao_direita.aceita(self)))

    def Visita_numero(self, numero):
        print (numero.avalia(),)

class Subtracao(object):
    def __init__(self,  expressao_esquerda, expressao_direita):
        self.__expressao_esquerda = expressao_esquerda
        self.__expressao_direita = expressao_direita

    @property
    def expressao_esquerda(self):
        return self.__expressao_esquerda

    @property
    def expressao_direita(self):
        return self.__expressao_direita

    def avalia(self):
        return self.__expressao_esquerda.avalia() - self.__expressao_direita.avalia()

    def aceita(self, visitor):
        visitor.Visita_subtracao(self)


class Soma(object):
    def __init__(self, expressao_esquerda, expressao_direita):
        self.__expressao_esquerda = expressao_esquerda
        self.__expressao_direita = expressao_direita

    @property
    def expressao_esquerda(self):
        return self.__expressao_esquerda

    @property
    def expressao_direita(self):
        return self.__expressao_direita

    def avalia(self):
        return self.__expressao_esquerda.avalia() + self.__expressao_direita.avalia()

    def aceita(self, visitor):
        visitor.Visita_soma(self)

class Divisao(object):
    def __init__(self,  expressao_esquerda, expressao_direita):
        self.__expressao_esquerda = expressao_esquerda
        self.__expressao_direita = expressao_direita

    @property
    def expressao_esquerda(self):
        return self.__expressao_esquerda

    @property
    def expressao_direita(self):
        return self.__expressao_direita

    def avalia(self):
        return self.__expressao_esquerda.avalia() / self.__expressao_direita.avalia()

    def aceita(self, visitor):
        visitor.Visita_divisao(self)

class Multiplicacao(object):
    def __init__(self,  expressao_esquerda, expressao_direita):
        self.__expressao_esquerda = expressao_esquerda
        self.__expressao_direita = expressao_direita

    @property
    def expressao_esquerda(self):
        return self.__expressao_esquerda

    @property
    def expressao_direita(self):
        return self.__expressao_direita

    def avalia(self):
        return self.__expressao_esquerda.avalia() * self.__expressao_direita.avalia()

    def aceita(self, visitor):
        visitor.Visita_multiplicacao(self)

Ao executar o código abaixo:

Saida:
2
3
( None + None )
4
2
( None / None )
( None - None )

Código:

class Numero(object):
    def __init__(self, numero):
        self.__numero = numero

    def avalia(self):
        return self.__numero

    def aceita(self, visitor):
        visitor.Visita_numero(self)

if __name__ == '__main__':

    #Calculando a expressão "(2+3)-4/2".

    expressao_esquerda = Soma(Numero(2), Numero(3))
    expressao_direita =  Divisao(Numero(4), Numero(2))

    expressao_conta =  Subtracao(expressao_esquerda, expressao_direita)
    #print (expressao_conta.avalia())

    #Mostra os parenteses e sinais dos operadores
    # da expressão (2+3)-4/2

    impresao = Impressao()
    expressao_conta.aceita(impresao)
1 resposta

olá franciscarlos, tem um problema com o código. veja neste outro post do fórum onde aparece essa mesma questão: https://cursos.alura.com.br/forum/topico-expressao-com-valor-none-ao-inves-de-numero-46604

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software