Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Observação sobre o codigo

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?

4 respostas
solução!

Olá Ricardo.

Você poderia postar seus códigos completos para eu conseguir reproduzir o que você está propondo ? Obrigado.

Mas somente especulando, diria que como o seu atributo carteira é privado você não consegue acesso de gravação nele, somente de leitura já que utilizou o @property

Recomento criar um setter para o atributo carteira na classe Usuario dessa maneira:

   @carteira.setter
    def carteira(self, valor):
        self.__carteira = valor

Espero ter ajudado, qualquer duvida não hesite em perguntar.

Bons estudos.

Oi tudo bem Igor? Olha até onde eu entendi, no Python não existiria a criação de argumento privado de forma que não seja possivel acesso de gravação. Colocar argumento como privado seria somente um name mangling para esconder o acesso dele, então não me parece fazer sentido a solução que tu propôs.

Efetivamente, quando eu tirei o argumento do privado eu pude executar o codigo. Acho que eu havia entendido de forma equivocada o conceito de property... Não havia entendio que @property era um getter somente. Obrigado

Olá Ricardo, que bom que deu certo.

Quanto aos atributos privates em Python, eles funcionam apenas renomeando o seu atributos, por exemplo.

def __init__(self, nome, idade):
        self.__nome = nome
        self.__idade = idade

O atributo __nome vai ser _NomeDaClasse__nome, na Classe Teste ficaria _Teste__nome, por isso ele não é private "de verdade".

class Teste:

    def __init__(self, nome, idade):
        self.__nome = nome
        self.__idade = idade
>>> Pessoa1 = Teste('Igor',26)
>>> Pessoa1._Teste__nome
'Igor'
>>> 

Espero ter ajudado, se tiver alguma duvida pode perguntar.

Bons estudos.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software