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::