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