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

Problema com self

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

1 resposta
solução!

Entendi porque estava errando. Não precisava declarar 'self' nos impostos mais simples porque não inicializava o objeto de sua classe, simplesmente chamava diretamente o método 'calcula', entretanto, para os impostos mais "complexos", que chamavam outros métodos, usava o parâmetro 'self', eu precisava fazer uma auto referência na classe para fazer isso.

Ou seja, precisava instanciar o objeto primeiro, aí sim, todos os 'self' de todas as classes se fariam necessários.

Adicionei a inicialização do objeto imposto 'tax = tax()' na classe 'tax_calculator'. Assim, tudo fez sentido :-D