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)

porque não consigo compara os valores?

a minha ideia, foi: ao invés de fazer todo um código de comparação entre os valores de uma lista, pra jogar esses valores dentro de uma variável. pq não criar uma variável (ou uma função) que retorna o valor máximo (ou mínimo) de uma lista?

código como feito no vídeo da aula 03:

class Leilao:

    def __init__(self, descricao):
        self.descricao = descricao
        self.__lances = []
        self.maior_lance = sys.float_info.min
        self.menor_lance = sys.float_info.max

    def adiciona(self, lance: Lance): 

        #aqui está a comparação dos valores em self.__lances
            if lance.valor > self.maior_lance:
                self.maior_lance = lance.valor
            if lance.valor < self.menor_lance:
                self.menor_lance = lance.valor

            self.__lances.append(lance)

    @property
    def lances(self):
        return self.__lances[:]

aqui está minha ideia (no caso como atributos da classe):

class Leilao:

    def __init__(self, descricao):
        self.descricao = descricao
        self.__lances = []
        self.maior_lance = max(self.__lances) #retorna maior valor da lista
        self.menor_lance = min(self.__lances) #retorna menor valor da lista

    def adiciona(self, lance: Lance):
            self.__lances.append(lance)

    @property
    def lances(self):
        return self.__lances[:]

apesar deu não entender mto bem o pq não funcionou, apareceu a msgm: '>' not supported between instances of Lance and Lance. quer dizer que numa lista com instâncias do tipo "Lance" eu não posso comparar? Teria algo como "def __ getitem__(self, item):" para eu herdar um duck typing de comparação? PS: tentei usar "def __ getitem__(self, item):" e não consegui

2 respostas
solução

Opa Henrique, tudo certo?

Ficou bem legal a sua implementação. Para utilizar os operadores < e >, a classe lance precisa implementar os métodos mágicos __lt__ - para o operador de menor que - e __gt__ para o operador de maior que.

No caso, como estamos falando da classe Lance, a implementação dela pode ficar parecida com essa:

class Lance:

    def __init__(self, usuario, valor):
        self.usuario = usuario
        self.valor = valor

    def __lt__(self, valor):
        return self.valor < valor

    def __gt__(self, valor):
        return self.valor > valor

Dessa forma, você consegue utilizar os operadores de comparação.

A implementação da classe Leilao, pode ficar parecida com essa:

class Leilao:

    def __init__(self, descricao):
        self.descricao = descricao
        self.__lances = []
        self.maior_lance = 0 
        self.menor_lance = 0

    def propoe(self, lance: Lance):
        self.__lances.append(lance)
        self.maior_lance = max(self.__lances) #retorna maior valor da lista
        self.menor_lance = min(self.__lances) #retorna menor valor da lista

    @property
    def lances(self):
        return self.__lances[:]

Neste caso, coloquei as implementações chamadas as funções max e min no método propoe, já que, se utilizarmos em uma lista vazia, eles lançam uma exceção.

Eu precisei inserir na classe Lance:

    def __str__(self):
       return str(self.valor)

pq qndo eu pedia pra retornar leilao.maior_lance, ele retornava o lugar na memória do maior_lance, e não o valor do lance! Brigadão Yuri!! To pegado nesse curso de TDD! Muito bom!