Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Código não imprime os valores dos novos impostos

A saída no terminal mostra o objeto em si, ela não mostra os valores de desconto do imposto, mesmo com o print e return. O que eu fiz de errado e não vi?

Saída no terminal:

<bound method ICPP.maxima_taxacao of <impostos.ICPP object at 0x0000014BFD833FD0>>

<bound method IKCV.maxima_taxacao of <impostos.IKCV object at 0x0000014BFD833FD0>>

Códigos Imposto:

from abc import ABCMeta, abstractmethod

class PadraoDeImpostoCondicional(object):

    __metaclass__ = ABCMeta
    def calcula(self, orcamento):
        if self.deve_usar_maxima_taxacao:
            return self.maxima_taxacao
        else:
            return self.minima_taxacao

    @abstractmethod
    def deve_usar_maxima_taxacao(self, orcamento):
        pass

    @abstractmethod
    def maxima_taxacao(self, orcamento):
        pass

    @abstractmethod
    def minima_taxacao(self, orcamento):
        pass


....


class ICPP(PadraoDemImpostoCondicional):


    def deve_usar_maxima_taxacao(self, orcamento):
         return orcamento.valor > 500 


    def maxima_taxacao(self, orcamento):
        return orcamento.valor * 0.07


    def minima_taxacao(self, orcamento):
        return orcamento.valor * 0.05


class IKCV(PadraoDemImpostoCondicional):


    def deve_usar_maxima_taxacao(self, orcamento):
        return orcamento.valor > 500 and self.__tem_item_maior_que_100_reais(orcamento)

    def maxima_taxacao(self, orcamento):
        return orcamento.valor * 0.1


    def minima_taxacao(self, orcamento):
        return orcamento.valor * 0.06


    def __tem_item_maior_que_100_reais(self, orcamento):
        for item in orcamento.obter_itens():
            if item.valor > 100:
                return True
            else:
                return False

Código main:

from impostos import  ICPP, IKCV

class CalculadorDeImportos(object):

    def reliza_calculo(self, orcamento, imposto):

        imposto_calculado = imposto.calcula(orcamento)
        print (imposto_calculado)

if __name__ == '__main__':

    from orcamento import Orcamento, Item

    orcamento = Orcamento()
    calculador = CalculadorDeImportos()
    orcamento.adicionar_itens(Item('Item 1', 250))
    orcamento.adicionar_itens(Item('Item 2', 50))
    orcamento.adicionar_itens(Item('Item 3', 100))


    print('ICPP, IKCV')
    calculador.reliza_calculo(orcamento, ICPP())
    calculador.reliza_calculo(orcamento, IKCV())
2 respostas
solução!

Oii Rafael, como você está? Espero que esteja bem ^-^

Sinto muito pela demora em obter um retorno.

Isso está ocorrendo por causa do seguinte trecho na classe PadraoDeImpostoCondicional:

 def calcula(self, orcamento):
        if self.deve_usar_maxima_taxacao:
            return self.maxima_taxacao
        else:
            return self.minima_taxacao

É necessário passar como argumento o orcamento para a função de maxima e minima taxação. Veja como fica a correção:

 def calcula(self, orcamento):
        if self.deve_usar_maxima_taxacao(orcamento):
            return self.maxima_taxacao(orcamento)
        else:
            return self.minima_taxacao(orcamento)

Após essa alteração o código irá retornar os valores dos impostos.

Qualquer dúvida estou por aqui, tá bom?

Grande abraço!

Estou bem sim. Obrigado, funcinou. Era isso mesmo

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software