1
resposta

@property

class Leilao
def __init__(self, descricao):
  self.descricao = descricao
  self.lances = []

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

não entendi porque qdo adiciona um lance usando a função append será adicionado na cópia da lista "lances" e não na original.

lancedoyuri = Lance(yuri, 100.0)
self.leilao.lances.append(lancedoyuri)

corrija meu raciocínio por favor... no meu entendimento ao utilizar lances.append() o lance seria adicionado na lista original e o property traria uma cópia desta lista com o lance novo.

1 resposta

Não, o @property serve pra você retornar um valor ao usar leilao.lances. O @property é a forma pythonica de fazer um getter no python.

Oself.leilao.lances.append(lance) vai adicionar o lance na lista original. Na hora de você retornar a lista pro usuario ao invés de retornar a lista original você retorna uma copia rasa dela o que significa que não vai ser o mesmo objeto de lista mas os itens dentro da lista copiada ainda vão ser os mesmos objetos na memoria.

livros_yan = [['Banco MySQL'], ['Certificação PHP', 'TDD PHP'], ['HTML5 e CSS3']]
livros_pedro = livros_yan[:]
print('pedro:',livros_pedro,'\n')

>>>pedro: [['Banco MySQL'], ['Certificação PHP', 'TDD PHP'], ['HTML5 e CSS3']] 


# se você adiciona algo novo na copia não vai adicionar na original
# se você adicionar algo novo na original tambem nao vai adicionar na copia
livros_games = ['Jogos iOS']
livros_pedro.append(livros_games)

print('yan:',livros_yan)
print('pedro:',livros_pedro,'\n')

>>>yan: [['Banco MySQL'], ['Certificação PHP', 'TDD PHP'], ['HTML5 e CSS3']]
>>>pedro: [['Banco MySQL'], ['Certificação PHP', 'TDD PHP'], ['HTML5 e CSS3'], ['Jogos iOS']]


# mas os elementos que elas compartilham sao iguais em ambas 
# e se você remover de uma vai sumir da outra tambem
livro_php = 'Certificação PHP'
livros_yan[1].remove(livro_php)

print('yan:',livros_yan)
print('pedro:',livros_pedro)

>>>yan: [['Banco MySQL'], ['TDD PHP'], ['HTML5 e CSS3']]
>>>pedro: [['Banco MySQL'], ['TDD PHP'], ['HTML5 e CSS3'], ['Jogos iOS']]

Tem varias vantagens e desvantagens em relação a cada maneira de se copiar uma lista, se você quiser saber mais leia esse artigo da alura que explica melhor, eu peguei parte dos exemplos de lá inclusive :)

Se quiser saber mais sobre getters e setters tem esse site (em ingles) que explica muito bem.