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

setters em propriedades tipo listas e afins.

Boa noite, me surgiu uma dúvida com relação a como definir um property.setter de uma propriedade tipo lista. Exemplo de código:

class filmes():
    def __init__(self,nomeFilme,anoFilme,categFilme,funcionariosFilme,duracaoFilme):
        if type(funcionariosFilme) is list:
            self.__funcionariosFilme = funcionariosFilme
            self.__nomeFilme = nomeFilme
            self.__anoFilme = anoFilme
            self.__categFilme = categFilme
            self.__duracaoFilme = duracaoFilme
            self.__likes = 0
        else:
            print("Please tell us the right information")

    @property
    def likes(self):
        return self.__likes
    @property
    def duracaoFilme(self):
        return self.__duracaoFilme
    @property
    def categFilme(self):
        return self.__categFilme.title()
    @property
    def anoFilme(self):
        return self.__anoFilme
    @property
    def nomeFilme(self):
        return self.__nomeFilme.title()
    @property
    def funcionariosFilme(self):
        return self.__funcionariosFilme       
    @likes.setter
    def likes(self,likesToAdd):
        self.likes += int(likesToAdd)
    @funcionariosFilme.setter
    def funcionariosFilme(self,index,key,newValue):
        self.__funcionariosFilme[index][key] = newValue

como eu faço pra definir o setter de funcionariosFilme?

Obrigado!

Att Guilherme Cabrera.

3 respostas
solução!

Só dar um append:

@funcionariosFilme.setter
    def funcionariosFilme(self, newValue):
        self.__funcionariosFilme.append(newValue)

meus_filmes = filmes('a',2007,'b',['c', 'd', 'f'],'55:00')
print(meus_filmes.funcionariosFilme)
>>>['c', 'd', 'f']
meus_filmes.funcionariosFilme = "g"
print(meus_filmes.funcionariosFilme)
>>>['c', 'd', 'f', 'g']

Ah, recomendo você trocar o nome da sua classe pro padrão que costuma ser usado no python segundo a pep 8

Também recomendo você usar uma cópia da sua lista no getter dela pra evitar dores de cabeça futura. Se quiser saber como funcionam copias de lista no pyton tem esse post da alura e no curso de TDD com python, nesse video o professor explica um pouco sobre isso tbm.

Opa Luigi, muito obrigado pela dica do setter e da cópia de lists. Realmente o que eu queria não era bem um setter.

Estava tentando fazer uma alteração nos funcionários então só crirei outro método:

def alteraFuncionario(self,index,key,newValue):
        self.__funcionarios[index][key] = newValue

Nesse ponto, irei verificar essas questões de encapsulamento para melhorar esse código.

Obrigado de novo :)

Att.

Ah sim, você queria trocar um funcionario que já estivesse na lista e não adicionar um novo. Realmente são funcionalidades diferentes, pensando nisso outra coisa que pode ser legal é adicionar um metodo de remover um funcionario também. Assim você teria o setter pra adicionar, a nova função de remover, a função de alterar e o getter pra retornar todos eles. Praticamente um CRUD só que em listas :)