1
resposta

Sintaxe de property

Olá, pessoal! Fiquei com dúvida se, para usar o property, é necessário deixar o atributo privado, também ou apenas dentro do método. Por exemplo, na aula, o prof. nos passa algo, mais ou menos, assim:

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

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

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

Mas, ao pesquisar alguns códigos na internet, vi que as pessoas não deixam o atributo em si privado, apenas nos métodos acessores, assim:

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

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

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

Há diferença dessa forma? Também vi utilizarem apenas um underscore, em vez de dois, dá na mesma?

Outras 2 dúvidas: pelo visto, diferentemente de outras linguagens em OO, recomenda-se mais utilizar property do que get e set em python, correto? E alguém poderia me explicar por que o código retorna erro quando utilizamos property sem declarar como privado, no método? Queria saber o que ocorre "por baixo dos panos", o que não foi explicado.

Obs: embora tenha ficado com essas dúvidas, as aulas do Nico são show, desde as que fiz da formação Java. Parabéns ao instrutor pela didática :)

1 resposta

Bom dia Giovani, Beleza? Vou tentar contribuir com um pouco que aprendi também.

Primeiro ponto. Se no "_ _ init _ _ ():" você declarar o atributo como público (self.nome) e na property tentar chamar o atributo com o duplo underline (self.__nome), o python não vai te retornar o valor do atributo self.nome, pois para ele são duas variáveis diferentes. Então quando fizer um property deve chamar o nome do atributo conforme foi declarado (seja público ou privavdo). Com relação a um ou dois underlines, existe uma convenção de que quando você vê um atributo com somente um underline (self. _nome) você o interprete como sendo privado e use a property e o setter para manipular os valores desse atributo. Já quando declara com um duplo underline o python muda a forma de acessar o atributo, nesse caso ele fica acessível quando você usa por exemplo " _Pessoa. _ _none" O atributo em python não fica 100% privado, ele apenas muda a sua forma de acesso. o @property e @property.setter são a maneira de fazer o get e setter no python. Espero ter ajudado e se falei besteira me corrijam aí pessoal.