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

Por que declarar o atributo como privado utilizando o @property ou @atributo.setter?

Eu simulei o erro pra tentar entender o motivo da declaração privada do atributo. Este é o erro retornado quando o atributo nome não é declarado como privado: RecursionError: maximum recursion depth exceeded. Porém, não ficou claro para mim o por quê ele acontece e qual o efeito da declaração privada sobre ele para que não ocorra.

2 respostas
solução!

Cole seu código aqui, mas provavelmente você está fazendo a alteração da propriedade dentro do setter dessa propriedade, assim o setter acaba chamando a si próprio, provavelmente algo como.

Essa é inclusive uma técnica de programação, mas certamente não é o que você quer fazer nesse caso.

@x.setter
alterar_x( valor ):
  this.x=valor #Aqui você vai chamar o setter de novo, levando a uma recursão inifinita

Oii Isabelle, tudo bem com você?

Excelente pergunta =)

Esse erro acontece quando declaramos os mesmos nomes para o atributo, a property de getter e a property de setter. Suponho que você tenha testado algo similar ao código abaixo:

class Autor:

    def __init__(self, nome):
        self.nome = nome

    @property
    def nome(self):
        return self.nome

    @nome.setter
    def nome(self, nome):
        self.nome = nome

clarice = Autor('Clarice Lispector')

Quando atribuímos o self.nome = nome, internamente o que o Python fará é verificar se há algum método setter com o nome daquele atributo e nesse caso, ele o encontrará:

image

Porém, dentro desse método, fazemos a mesma atribuição da linha 4: self.nome = nome, então o Python novamente irá chamar o mesmo setter. Com isso, ele ficará nesse loop de chamar a si próprio até que se atinja um limite, por isso o erro de RecursionError: maximum recursion depth exceeded.

A ideia geral é que quando formos criar alguma propriedade de setter da forma exemplificada acima, criemos um novo atributo "privado", seja com um ou dois underscores para mostrar que ele é "privado" e para que não fique com o mesmo nome da propriedade(em python privado não existe, usa-se apenas convenções para dizer ao programador que aquela variável ficará dentro de um contexto específico e não deve ser acessada diretamente pelo "lado de fora"). Veja um exemplo:

class Autor:

    def __init__(self, nome):
        self.nome = nome

    @property
    def nome(self):
        return self._nome

    @nome.setter
    def nome(self, nome):
        self._nome = nome

clarice = Autor('Clarice Lispector')
clarice.nome = 'Clarice Falcão'
print(clarice.nome)

Você também pode encontrar exemplos de códigos que declarem o atributo com duplo underscore inicialmente. Da forma abaixo:

class Autor:

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

    @property
    def nome(self):
        return self.__nome

    @nome.setter
    def nome(self, nome):
        self.__nome = nome

clarice = Autor('Clarice Lispector')
clarice.nome = 'Clarice Falcão'
print(clarice.nome)

E nesse caso, a propriedade de setter só será chamada quando fizermos: clarice.nome = 'Clarice Falcão'

Pegou a ideia?

Qualquer dúvida, fique a vontade para perguntar. Estou a disposição. Abraços e 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