Quando tento implementar meus métodos calcula_imposto(self, orcamento)
o Python acusa o erro TypeError: calculates_tax() missing 1 required positional argument: 'budget'
. Nota, no meu código, usei nomes em inglês.
Consegui me livrar desse erro quando apaguei o self
e deixei apenas o orcamento
como argumento. Até aí tudo bem e entendi um pouco, mas surgiu a primeira dúvida: Quando posso deixar de usar o self? Nos vídeos, dá erro quando o professor não usa e comigo dá erro quando eu uso, isso deve-se porque ele trabalhou com Python 2 e eu com Python 3?
Só que a coisa piora quando vou trabalhar na primeira versão do imposto IKCV
. Nele, há um método extra, __tem_item_maior_que_100_reais
, que é chamado pelo método calcula_imposto
. Vou passar o código para ficar mais claro aqui:
class IKCV(object):
def calculates_tax(self, budget):
if budget.value > 500 and (
self.__has_item_greater_than_100_reais(budget)
):
return budget.value * 0.01
else:
return budget.value * 0.06
def __has_item_greater_than_100_reais(budget):
for item in budget.get_itens():
if item.value > 100:
return True
else:
return False
Novamente, todos os nomes em inglês, ok.Caio no problema de usar o self
novamente, mas se não usar, o método não reconhece a função que precisa chamar self.__has_item_greater_than_100_reais
. Tentei tirar o self.
da função deixando apenas __has_item_greater_than_100_reais
, também tentei colocar ela fora da classe, mas nenhuma tentativa funcionou.
Achei que o Python iria interpretar o self
como uma instância da classe, como chamá-la e como chamar seus atributos e métodos a partir dele e que o Python não o substituísse quando passássemos um argumento ao método. Mas parece que é exatamente isso que está acontecendo. Tive que apagar os self
dos métodos porque ele reclamava que deveria ser passado dois argumentos e não dois. Até onde eu sei, tudo bem, o Python só substitui o self
se ele foi gerado previamente na classe, por exemplo, num construtor __init__
.
Se boa parte do que falei faz sentido, então como posso resolver este impasse? Devo usar o self
? Por que o professor deve usar e comigo dá erro? O mais próximo que consegui entender foi neste outro fórum
E por que usar no começo de toda classe o argumento object
? Eu usei e deixei de usar e funcionou do mesmo jeito, mas isso aparentemente é só uma curiosidade. Pode ser em relação ao Python 2 também.
Muito obrigado