1
resposta

Estou tentando converter o código da aula em Python 3 mas estou com problemas

Algum instrutor poderia por favor me ajudar a converter esse código da aula em python 3 e me explicar oq estou errando? Meu código está logo abaixo,

calculadora_de_impostos:

from impostos import ISS, ICMS, ICPP, IKCV

class Calculador_de_impostos():

    def realiza_calculo(self, orcamento, imposto):
        imposto_calculado = imposto.calcula(self, orcamento)
        print(imposto_calculado)

if __name__ == '__main__':
    from orcamento import Orcamento, item

    calculador = Calculador_de_impostos()

    orcamento = Orcamento()
    orcamento.adiciona_item(item('ITEM 1', 50))
    orcamento.adiciona_item(item('ITEM 2', 200))
    orcamento.adiciona_item(item('ITEM 3', 250))

    print('ISS e ICMS')
    calculador.realiza_calculo(orcamento, ISS)
    calculador.realiza_calculo(orcamento, ICMS)

    print('ICPP e IKCV')
    calculador.realiza_calculo(orcamento, ICPP)
    calculador.realiza_calculo(orcamento, IKCV)

impostos:

import abc

class Template_de_imposto_condicional(metaclass=abc.ABCMeta):

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

    @abc.abstractmethod
    def deve_usar_maxima_taxacao(self, orcamento):
        return

    @abc.abstractmethod
    def maxima_taxacao(self, orcamento):
        return

    @abc.abstractmethod
    def minima_taxacao(self, orcamento):
        return

class ISS():

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

class ICMS():

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

class ICPP(Template_de_imposto_condicional):

    def deve_usar_maxima_taxacao(self, orcamento):
        if orcamento.valor > 500:
            return True
        else:
            return False

    def maxima_taxacao(self, orcamento):
        print(orcamento.valor * 0.05)

    def minima_taxacao(self, orcamento):
        print(orcamento.valor * 0.07)

class IKCV(Template_de_imposto_condicional):

    def deve_usar_maxima_taxacao(self, orcamento):
        if orcamento.valor > 500 and self._tem_item_maior_que_100_reais(orcamento):
            return True
        else:
            return False

    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

O erro que está aparecendo é esse:

Traceback (most recent call last):
  File "C:/Users/XPS/PycharmProjects/Design Patterns/calculadora_de_impostos.py", line 24, in <module>
    calculador.realiza_calculo(orcamento, ICPP)
  File "C:/Users/XPS/PycharmProjects/Design Patterns/calculadora_de_impostos.py", line 6, in realiza_calculo
    imposto_calculado = imposto.calcula(self, orcamento)
  File "C:\Users\XPS\PycharmProjects\Design Patterns\impostos.py", line 6, in calcula
    if self.deve_usar_maxima_taxacao(orcamento) == True:
AttributeError: 'Calculador_de_impostos' object has no attribute 'deve_usar_maxima_taxacao'
1 resposta

Olá João, tudo bem com você?

Peço desculpas pela demora em lhe responder.

Realizei algumas mudanças nos códigos enviados, de forma que não seja apresentado o erro quando é realizado a execução, como era necessário um terceiro módulo (orcamento.py) realizei o teste com o disponibilizado na aula, deixo abaixo os códigos referêntes aos módulos calculadora_de_impostos e impostos.

As mudanças realizadas estão indicadas por comentários no código.

calculadora_de_impostos

from impostos import ISS, ICMS, ICPP, IKCV


class CalculadorDeImpostos:  # Remoção de parêntese e mudança do nome para CamelCase

    def realiza_calculo(self, orcamento, imposto):
        imposto_calculado = imposto.calcula(orcamento)  # Retirado o parâmetro self
        print(imposto_calculado)


if __name__ == '__main__':
    from orcamento import Orcamento, Item  # Nome Item mudado para ficar conforme o nome da classe do módulo orcamento

    calculador = CalculadorDeImpostos()  # mudança do nome para CamelCase

    orcamento = Orcamento()
    orcamento.adiciona_item(Item('ITEM 1', 50))  # Nome Item mudado para ficar conforme o nome da classe do módulo orcamento
    orcamento.adiciona_item(Item('ITEM 2', 200))  # Nome Item mudado para ficar conforme o nome da classe do módulo orcamento
    orcamento.adiciona_item(Item('ITEM 3', 250))  # Nome Item mudado para ficar conforme o nome da classe do módulo orcamento

    print('ISS e ICMS')
    calculador.realiza_calculo(orcamento, ISS())  # Adicionado parênteses para invocar o método ISS()
    calculador.realiza_calculo(orcamento, ICMS())  # Adicionado parênteses para invocar o método ICMS()

    print('ICPP e IKCV')
    calculador.realiza_calculo(orcamento, ICPP())  # Adicionado parênteses para invocar o método ICPP()
    calculador.realiza_calculo(orcamento, IKCV())  # Adicionado parênteses para invocar o método IKCV()

impostos


import abc


class Template_de_imposto_condicional(metaclass=abc.ABCMeta):

    def calcula(self, orcamento):
        if self.deve_usar_maxima_taxacao(orcamento):  # Retirada do == True
            return self.maxima_taxacao(orcamento)
        else:
            return self.minima_taxacao(orcamento)

    @abc.abstractmethod
    def deve_usar_maxima_taxacao(self, orcamento):
        pass  # mudança de return para pass

    @abc.abstractmethod
    def maxima_taxacao(self, orcamento):
        pass  # mudança de return para pass

    @abc.abstractmethod
    def minima_taxacao(self, orcamento):
        pass  # mudança de return para pass


class ISS:  # Remoção de parêntese

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


class ICMS:  # Remoção de parêntese

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


class ICPP(Template_de_imposto_condicional):

    def deve_usar_maxima_taxacao(self, orcamento):
        if orcamento.valor > 500:
            return True
        else:
            return False

    def maxima_taxacao(self, orcamento):
        print(orcamento.valor * 0.05)

    def minima_taxacao(self, orcamento):
        print(orcamento.valor * 0.07)


class IKCV(Template_de_imposto_condicional):

    def deve_usar_maxima_taxacao(self, orcamento):
        if orcamento.valor > 500 and self._tem_item_maior_que_100_reais(orcamento):
            return True
        else:
            return False

    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

Em caso de dúvidas, encontro-me à disposição.

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!