3
respostas

Programação Defensiva Python

Como consigo proteger essa minha propriedade lances?

Criei um metodo propor_lance() para poder realizar a inserção de novos lances, mas se tentar realizar a inserção atraves do lances.append(), o sistema ainda permite, mesmo estando protegido com undescore.

Classe Leilão

    Class Leilao:
        def __init__(self, descricao):
        self.descricao = descricao
        self.__lances = []

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

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

Main

    leilao_teste.lances.append(lance_um) # Não deveria mais funcionar, mas funciona
    leilao_teste.propor_lance(lance_um) # Forma correta
3 respostas

Olá Witalo.

Propriedades e métodos privados no Python são apenas uma convenção, então "teoricamente" o programador deverá "saber" que está fazendo algo errado ao manipular desta forma.

Mas acredito que para evitar que a self.__lances seja manipulada dessa forma, ao invés de criar uma property que retorna uma lista ( e dessa forma deixar acessar métodos de lista ), eu utilizaria um método responsável por incrementar a lista.

como eu faria:

def add_novo_lance(self, lance):
        self.__lances.append(lance)

Espero que ajude hehe

até +

Rafa,

Boa Tarde!

Como vai? Espero que bem! Pois foi exatamente o que fiz...

Criei o metodo propor_lance (leilaoteste.proporlance()) para realizar essa função, mas ao rodar codigo os incrementos anteriores (leilaoteste.lances.append()) continuaram funcionando normalmente.

O a inclusão funciona, por que leilaoteste.lances vai retornar uma lista e assim você vai ter acesso ao método .append() , talvez uma forma de coibir esse acesso seria fazer um cast transformando a lista em String ... mas dessa forma você deixa de ter acesso a uma lista, tavez seja útil mas depende do caso.

        def lances(self):
                return str(self.__lances)

mas o atrabuto privado é apenas uma convenção, na vida real isso é levado bastante a sério hehe

até +