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

Erro no código

Olá, estou tentando executar o código abaixo mas um erro é exibido. Poderiam me ajudar em identificar o erro?

# -*- coding: UTF-8 -*-
# calculador_de_impostos.py

class Calculador_de_impostos(object):

    def realiza_calculo(self, orcamento, calcula_imposto):
        valor = calcula_imposto(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, ICMS().calcula_ICMS) # imprime 50.0
    calculador_de_impostos.realiza_calculo(orcamento, ISS().calcula_ISS)  # imprime 30.0
# -*- coding: UTF-8 -*-
# impostos.py
class ICMS(object):
    def calcula_ICMS(orcamento):
        return orcamento.valor * 0.1

class ISS(object):
    def calcula_ISS(orcamento):
        return orcamento.valor * 0.06
# -*- coding: UTF-8 -*-
# orcamento.py
class Orcamento(object):
  def __init__(self, valor):
    self.__valor = valor

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

Mensagem de erro:

C:\Python37\python.exe "C:/Users/Roger/OneDrive/Cursos/Carreira - Python/Design Patterns/calculador_de_impostos.py"
Traceback (most recent call last):
  File "C:/Users/Roger/OneDrive/Cursos/Carreira - Python/Design Patterns/calculador_de_impostos.py", line 16, in <module>
    calculador_de_impostos.realiza_calculo(orcamento, ICMS().calcula_ICMS) # imprime 50.0
  File "C:/Users/Roger/OneDrive/Cursos/Carreira - Python/Design Patterns/calculador_de_impostos.py", line 7, in realiza_calculo
    valor = calcula_imposto(orcamento)
TypeError: calcula_ICMS() takes 1 positional argument but 2 were given

Process finished with exit code 1
1 resposta
solução!

Oi Roger, tudo bem?

Esse erro acontece, pois quando você chama um método, o próprio objeto é passado como parâmetro (self). Por isso, está falando que você precisava de um parâmetro mas o método recebeu dois, já que o self foi passado também.

Para resolver esse problema, basta receber o objeto como parâmetro no método:

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