Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Porquê chamar o próximo desconto no inicializador?

Não entendi porquê o professor chamou o desconto no inicializador. Me parece que se tivéssemos vários descontos teríamos um código bem poluído com várias chamadas e parâmetros. Minha sugestão é colocar a chamada da próxima classe dentro da própria função calcula, daí teríamos uma cadeia inteira 'escondida' em chamadas internas. Além disso não precisaríamos criar uma classe SemDesconto(), bastaria retornar zero na classe que representasse o último desconto possível. Faz sentido?

O código ficaria assim:

class DescontoPorCincoItens(object):

    def calcula(self, orcamento):
        if orcamento.total_itens > 5:
            return orcamento.valor * 0.1
        else:
            desconto = DescontoPorMaisDeQuinhentosReais().calcula(orcamento)
            return desconto

class DescontoPorMaisDeQuinhentosReais(object):

    def calcula(self, orcamento):
        if orcamento.valor >= 500:
            return orcamento.valor * 0.07
        else:
            return 0
1 resposta
solução

Bom, ainda não obtive resposta mas depois de alguns estudos e revendo cheguei a seguinte conclusão (gostaria que alguém verificasse aqui mesmo assim :D): o professor inicializa o próximo desconto para tornar a classe mais genérica, logo eu não precisaria determinar dentro do método o próximo desconto, ao invés disso, flexibilizaria o uso de qualquer desconto, caso a política de descontos mudasse, por exemplo. Mas poderíamos, por exemplo, passar apenas o objeto da classe como parâmetro e executa-lo apenas dentro do método com os parâmetros necessários, no caso, o próximo desconto; neste caso voltaríamos a ficar um pouco engessados e teríamos que mudar o parâmetro (próximo desconto) caso a política mudasse. No final das contas, para termos total flexibilidade teríamos que deixar aquela pilha de parâmetros e descontos mesmo hehehehe