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

Dúvida no Ex. 3 da Aula 5 - Estados que variam e o State

Retornou o seguinte erro:

Orçamento aprovado:
    orcamento.estado_atual(OrcamentoAprovado())
TypeError: 'OrcamentoEmAprovacao' object is not callable

Segue o código do arquivo model/states/orcamentoStates.py:

#-*- coding: UTF-8 -*-
__author__ = 'douglas_bonafe'
__name__ = 'estados dos objetos'

# Necessary to create abstract classes and methods
from abc import ABCMeta, abstractmethod

class EstadosDeOrcamento(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def aplica_desconto_extra(self, orcamento):
        pass

class OrcamentoAprovado(EstadosDeOrcamento):

    def __init__(self, taxa=0.02):
        self.__taxa = taxa

    def aplica_desconto_extra(self, orcamento):
        orcamento.seta_descontos_extra(self.__taxa)

    @property
    def taxa(self):
        return self.__taxa

class OrcamentoReprovado(EstadosDeOrcamento):

    def aplica_desconto_extra(self, orcamento):
        raise Exception('Orcamentos reprovados não podem receber descontos.')

class OrcamentoEmAprovacao(EstadosDeOrcamento):

    def __init__(self, taxa=0.05):
        self.__taxa = taxa

    def aplica_desconto_extra(self, orcamento):
        orcamento.seta_descontos_extra(self.__taxa)

    @property
    def taxa(self):
        return self.__taxa

class OrcamentoFinalizado(EstadosDeOrcamento):

    def aplica_desconto_extra(self, orcamento):
        raise Exception('Orcamentos finalizados não podem receber descontos.')

Segue o código do arquivo model/strategy/calculador_de_impostos.py, onde contém o main executado.

# -*- coding: UTF-8 -*-
__author__ = 'douglas_bonafe'
class Calculador_de_Impostos(object):
    def realiza_calculo(self, orcamento, imposto):
        imposto_calculado = imposto.calcula(orcamento)
        print(imposto_calculado)

if __name__ == '__main__':
    from model.orcamento import Orcamento, Item
    from model.strategy.calculador_de_impostos import Calculador_de_Impostos
    from model.strategy.impostos import ICMS, ISS, ICPP, IKCV, IPX

    orcamento = Orcamento()
    # adicionando itens ao orçamento
    orcamento.adiciona_item(Item('ITEM 1', 50))
    orcamento.adiciona_item(Item('ITEM 2', 200))
    orcamento.adiciona_item(Item('ITEM 3', 250))

    print 'Orçamento esperando aprovação:'
    print orcamento.valor

    print 'Orçamento aprovado:'
    from model.states.orcamentoStates import OrcamentoAprovado
    orcamento.estado_atual(OrcamentoAprovado())
    print orcamento.valor


    calculador_de_impostos = Calculador_de_Impostos()
    print 'ISS e ICMS'
    calculador_de_impostos.realiza_calculo(orcamento, ISS())
    calculador_de_impostos.realiza_calculo(orcamento, ICMS())

    # cálculo dos novos impostos
    print 'ICPP e IKCV'
    calculador_de_impostos.realiza_calculo(orcamento, ICPP()) # imprime 25.0
    calculador_de_impostos.realiza_calculo(orcamento, IKCV()) # imprime 30.0

    # padrão decorator: impostos sobre impostos

    print 'ICPP com IKCV'
    calculador_de_impostos.realiza_calculo(orcamento, ICPP(IKCV()))

    print 'ICMS com ISS'
    calculador_de_impostos.realiza_calculo(orcamento, ICMS(ISS()))

    # decorador do Python e Imposto X
    print 'IPX := tx = 25%'
    calculador_de_impostos.realiza_calculo(orcamento, IPX(0.25))
2 respostas
solução!

Na classe Orcamento, estado_atual é um atributo, não um método, a não ser que você tenha alterada a classe, por isso é importante ver como você a criou.

Como você não respondeu, concluI a dúvida. Mas se ainda tiver dúvida, não deixe de postar.

Abraço e bom estudo.