Tudo bem Flávio?
Eu resolvi dar mais uma incrementada em nossas classes de cálculo de imposto, pois estava incomodado de ter que lembrar de somar o imposto do decorador ao imposto da classe em questão todas as vezes, então fiz o seguinte:
em Imposto criei o estrategia_calculo_imposto que irar fazer o cálculo do imposto em questão, e em seguida o somei ao cálculo do imposto recebido como decorador(caso exita claro)
class Imposto(object):
__metaclass__ = ABCMeta
def __init__(self, outro_inposto = None):
self.__outro_inposto = outro_inposto
def calcula(self, orcamento):
if(self.__outro_imposto is None):
return self.estrategia_calculo_imposto(orcamento) #retornamos a estrategia de cálculo
return self.estrategia_calculo_imposto(orcamento) + self.__outro_inposto.calcula(orcamento)
@abstractclassmethod
def estrategia_calculo_imposto(self, orcamento):
pass
Agora, a classe ICMS por exemplo que herda de Imposto, nao precisa declarar o calcula de forma concreta, ele será substituido pela estrategia_calculo_imposto,
class ICMS(Imposto):
def estrategia_calculo_imposto(self, orcamento):
return orcamento.valor *0.1