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

Como ficaria a implementação da classe "Expressao" com o método abstrato "avalia"?

Seria mais ou menos isso (?):

# -*- coding: UTF-8 -*-
# DSL e Interpreter
#../design-patterns-python/contrato.py

from abc import abstractmethod, ABCMeta

class Expressao(object):

    __metaclass__ = ABCMeta

    @abstractmethod
    def avalia(self): pass


class Subtracao(Expressao):

    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())


class Soma(Expressao):

    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())


class Numero(Expressao):

    def __init__(self, numero):
        self.__numero = numero

    def avalia(self):
        return self.__numero
1 resposta
solução!

Olá Wilton,

Essa é a ideia. Se você tentar remover a implementação da classe Soma , vai perceber que o código não será executado. Vai dar um erro.

O python vai te lembrar sempre que esquecer de implementar um método abstrato numa classe filha.

Abraços!

Luan