Observei ao longo do curso que o codigo possui um problema fundamental: não ha reset do valor da carteira caso um lance do leilão tenha sido ultrapassado por outra pessoa. O valor dos lances é deduzido da carteira como se todo usuario tivesse efetivamente ganhado o leilão ao qual participou. O que significa que se o mesmo usuario fizer dois lances em um mesmo leilão (ainda que não sucessivos) ele é debitado duas vezes do saldo de sua carteira.
A saida que vejo para o problema seria resetar a carteira do usuario que fez o lance em self.lances[-1], assim, toda vez que um novo lance for realizado o detentor do lance antigo tem seu saldo restaurado e apenas os usuarios que estão com as melhores ofertas têm seu saldo descontado.
Tentei implementar desta forma:
def registra (self, lance: Lance):
if not self.__lances or self.__lances[-1].usuario != lance.usuario and lance.valor > self.__lances[-1].valor:
if not self.__lances:
self.menor_lance = lance.valor
else:
self.__lances[-1].usuario.carteira += self.__lances[-1].valor
self.maior_lance = lance.valor
self.__lances.append(lance)
else:
raise LanceInvalido("O mesmo usuario não pode propor dois lances consecutivos")
Infelizmente parece que eu não posso acessar a variavel carteira do usuario. Porque? Se eu estou passando para a função um classe do tipo Lance, que possui um Usuario e este, por sua vez, possui um argumento do tipo carteira, porque não posso acessar o argumento carteira da classe Usuario através de Lance?