são meio que dois que se juntam pela classe import
o primeiro é esse:
class Subtracao(object):
def __init__(self, expressao_esquerda, expressao_direita):
self.__expressao_esquerda = expressao_esquerda
self.__expressao_direita = expressao_direita
def avalia(self):
return (self.__expressao_esquerda.avalia()
- self.__expressao_direita.avalia())
@property
def expressao_esquerda(self):
return self.__expressao_esquerda
@property
def expressao_direita(self):
return self.__expressao_direita
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
def avalia(self):
return (self.__expressao_esquerda.avalia()
+ self.__expressao_direita.avalia())
def aceita(self, visitor):
visitor.visita_soma(self)
@property
def expressao_esquerda(self):
return self.__expressao_esquerda
@property
def expressao_direita(self):
return self.__expressao_direita
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':
from impressora import Impressora
expressao_esquerda = Subtracao(Numero(10), Numero(5))
expressao_direita = Soma(Numero(2), Numero(10))
expressao_conta = Soma(expressao_esquerda, expressao_direita)
visitor = Impressora()
expressao_conta.aceita(visitor)
mas não está dando problema
E esse é o outro:
class Impressora(object):
def visita_soma(self, soma):
print('(')
soma.expressao_esquerda.aceita(self)
print('+',)
soma.expressao_direita.aceita(self)
print(')',)
def visita_subtracao(self, subtracao):
print('(')
subtracao.expressao_esquerda.aceita(self)
print('-',)
subtracao.expressao_direita.aceita(self)
print(')',)
def visita_numero(self, numero):
print(numero.avalia(),)