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

AttributeError: 'ICPP' object has no attribute 'calcula'

Recebo o erro informado abaixo.

MacBook-Pro-de-Silvanio:patterns silvanioduartedacruz$ python calculador_de_impostos.py
INSS e ICMS
50.0
30.0
ICPP e IKCV
Traceback (most recent call last):
  File "calculador_de_impostos.py", line 29, in <module>
    calculador.realiza_calculo(orcamento, ICPP())
  File "calculador_de_impostos.py", line 10, in realiza_calculo
    imposto_calculado = imposto.calcula(orcamento)
AttributeError: 'ICPP' object has no attribute 'calcula'
MacBook-Pro-de-Silvanio:patterns silvanioduartedacruz$

calculador de impostos.py


# -*- coding: UTF-8 -*-

from impostos import ISS, ICMS, IKCV, ICPP

class Calculador_de_impostos(object):

    def realiza_calculo(self, orcamento, imposto):

        imposto_calculado = imposto.calcula(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 1', 200))
    orcamento.adiciona_item(Item('ITEM 1', 250))        

    print 'INSS 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.py

from abc import ABCMeta, abstractmethod

class Template_de_imposto_condicional(object):

    __metaclass__ = ABCMeta

    def calcula(self, orcamento):

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

    @abstractmethod
    def deve_usar_maxima_taxacao(self, orcamento):
        pass

    @abstractmethod
    def maxima_taxacao(self, orcamento):
        pass

    @abstractmethod
    def minima_taxacao(self, orcamento):
        pass

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

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

class ICPP(object):

    def deve_usar_maxima_taxacao(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(object):

    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.10

    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

            return False
1 resposta
solução!

Ja resolvi.....!

Eu estava criando as classes ICPP e IKCV como:

class IKCV(object):
class ICPP(object):

O correto é:

 class IKCV(Template_de_imposto_condicional):
class ICPP(Template_de_imposto_condicional):