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

Erro no calculador_de_impostos.py

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

from impostos import calcula_ISS, calcula_ICMS

class Calculador_de_impostos(object):

  def realiza_calculo(self, orcamento, imposto):

    if 'ICMS' == imposto:
      icms_calculado = calcula_ICMS(orcamento.valor)
      print (icms_calculado)
    elif 'ISS' == imposto:
      iss_calculado = calcula_ISS(orcamento.valor)
      print (iss_calculado)

if __name__ == '__main__':

    from orcamento import Orcamento

    orcamento = Orcamento(500.0)
    calculador_de_impostos = Calculador_de_impostos()
    calculador_de_impostos.realiza_calculo(orcamento, 'ICMS') # imprimie 50.0
    calculador_de_impostos.realiza_calculo(orcamento, 'ISS') # imprime 30.0

Quando tento executar aparece esse erro no terminal:

python calculador_de_impostos.py
Traceback (most recent call last):
  File "calculador_de_impostos.py", line 22, in <module>
    calculador_de_impostos.realiza_calculo(orcamento, 'ICMS') # imprimie 50.0
  File "calculador_de_impostos.py", line 10, in realiza_calculo
    icms_calculado = calcula_ICMS(orcamento.valor)
  File "C:\Users\LucasAmorim\Dropbox\Codigos\Python\Design Patterns\impostos.py", line 4, in calcula_ICMS
    return orcamento.valor * 0.1
AttributeError: 'float' object has no attribute 'valor'

Achei que podia ser um erro meu, mas mesmo copiando o código do site o erro continua.

7 respostas

Lucas, cola tua classe de orçamento. O erro diz que o orçamento não possui o atributo valor.

Não consegui entender ainda direito. Como assim colar a classe de orçamento?

Colar aqui a classe de orçamento, pra eu dar uma olhada. :) desculpa

#orcamento.py
class Orcamento(object):
  def __init__(self, valor):
    self._valor = valor

  @property
  def valor(self):
    return self._valor
#calculador_de_impostos.py
class Calculador_de_impostos(object):

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

if __name__ == '__main__':

    from orcamento import Orcamento
    from impostos import ISS, ICMS

    orcamento = Orcamento(500.0)
    calculador_de_impostos = Calculador_de_impostos()
    calculador_de_impostos.realiza_calculo(orcamento, ISS())
    calculador_de_impostos.realiza_calculo(orcamento, ICMS())
#impostos.py

class ICMS(object):
    def calcula_ICMS(self, orcamento):
        return orcamento.valor * 0.1

class ISS(object):
    def calcula_ISS(self, orcamento):
        return orcamento.valor * 0.06

Eu tentei já pegar o código pronto pra ver se funcionava porém continua dando algum erro:

python calculador_de_impostos.py
Traceback (most recent call last):
  File "calculador_de_impostos.py", line 16, in <module>
    calculador_de_impostos.realiza_calculo(orcamento, ISS())
  File "calculador_de_impostos.py", line 6, in realiza_calculo
    valor = imposto.calcula(orcamento)
AttributeError: 'ISS' object has no attribute 'calcula'

Interessante que o código é o mesmo do site, eu copiei pra ver se era algum erro de digitação meu, porém sempre tem esse erro de AttributeError. Não sei se pode ser algo relacionado a versão do python que uso ...

solução!

Lucas, no primeiro código que você mandou o erro era porque no Calculador_de_impostos voce tava passando o valor do orçamento e isso ja era passado lá no método que fazia o cálculo do imposto.

if 'ICMS' == imposto:
      icms_calculado = calcula_ICMS(orcamento)
      print (icms_calculado)
    elif 'ISS' == imposto:
      iss_calculado = calcula_ISS(orcamento)
      print (iss_calculado)

Aqui você passa so o orçamento.

Outra coisa na classe Orcamento

class Orcamento(object):
  def __init__(self, valor):
    self.__valor = valor

  @property
  def valor(self):
    return self.__valor

São dois __ antes de valor. Ta errado lá no exercício. Vou ajeitar isso.

Ok, eu entendi agora. Obrigado pela ajuda.