Não seria melhor se a classe Calculador_de_descontos recebesse os descontos por parâmetro?
class Calculador_de_descontos(object):
def calcula(self, orcamento, desconto):
return desconto.calcula(orcamento)
E no exemplo, não faz muito sentido Calculador_de_descontos existir já que tem apenas um método e nem possui estado.
A cadeia de descontos poderia ser chamada diretamente:
if __name__ == '__main__':
orcamento = Orcamento()
orcamento.adiciona_item(Item('Item A', 100.0))
orcamento.adiciona_item(Item('Item B', 50.0))
orcamento.adiciona_item(Item('Item C', 400.0))
desconto = Desconto_por_cinco_itens(
Desconto_por_mais_de_quinhentos_reais(
Sem_desconto()
)
)
desconto = desconto.calcula(orcamento)
print 'Desconto calculado : %s' % (desconto)