Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Imprimindo None a cada expressão visitada em soma e subtracao

Boa tarde!

Estou com um comportamento MUITO estranho no código que escrevi. Mudei alguns nomes quando escrevi o código mas acho isso não deveria influenciar o resultado.

Ah! Eu coloquei a classe visitante em um arquivo separado.

Alguma ideia do que pode estar errado?

Seguem evidências:

Saída:

C:\Dev\Alura\Python-DesignPatterns2>python operacoes.py
( 123 None + 67 None ) None 190
( 45 None - 43 None ) None = 2
( ( 123 None + 67 None ) None + ( 45 None - 43 None ) None ) None = 192
123

C:\Dev\Alura\Python-DesignPatterns2>

operacoes.py

from impressao import *

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

    def avalia(self):
        return self.__numero;

    def aceita(self, visitante):
        visitante.visita_numero(self)

class Soma(object):
    def __init__(self, lvalue, rvalue):
        self.__lvalue = lvalue
        self.__rvalue = rvalue

    @property
    def lvalue(self):
        return self.__lvalue

    @property
    def rvalue(self):
        return self.__rvalue

    def avalia(self):
        return self.__lvalue.avalia() + self.__rvalue.avalia()

    def aceita(self, visitante):
        visitante.visita_soma(self)

class Subtracao(object):
    def __init__(self, lvalue, rvalue):
        self.__lvalue = lvalue
        self.__rvalue = rvalue

    @property
    def lvalue(self):
        return self.__lvalue

    @property
    def rvalue(self):
        return self.__rvalue

    def avalia(self):
        return self.__lvalue.avalia() - self.__rvalue.avalia()

    def aceita(self, visitante):
        visitante.visita_subtracao(self)

if __name__ == '__main__':
    exp1=Soma(Numero(123),Numero(67))
    exp2=Subtracao(Numero(45), Numero(43))
    exp = Soma (exp1,exp2)
    impressao = Impressao()
    print "%s = %s" % (exp1.aceita(impressao) , exp1.avalia())
    print "%s = %s" % (exp2.aceita(impressao) , exp2.avalia())

    print "%s = %s" % (exp.aceita(impressao) , exp.avalia())

    Numero(123).aceita(impressao)

impressao.py

from operacoes import *

class Impressao(object):
    def visita_numero(self, numero):
        print numero.avalia(),

    def visita_soma(self, soma):
        print "(",
        print soma.lvalue.aceita(self),
        print "+" ,
        print soma.rvalue.aceita(self),
        print ")",

    def visita_subtracao(self, subtracao):
        print "(",
        print subtracao.lvalue.aceita(self),
        print "-" ,
        print subtracao.rvalue.aceita(self),
        print ")",

TIA,

WB::

1 resposta
solução!

Boa noite,

Já achei o que aconteceu. Os métodos de visita, imprimem resultados direito e ao colocá-los como parâmetro de um print, este imprime o resultado de suas chamadas que é None.

Att,

WB::