2
respostas

[Dúvida] Por que o Python permite acesso a atributos e métodos privados?

"É importante ressaltar que apesar desse acesso de um método ou atributo privado ser possível fora da classe de origem, ela não é recomendada, sendo uma má prática realizá-lo." Se o método ou atributo é privado, por que o Python ainda permite acessá-lo? No Java, sei que um erro é retornado ao tentar acessar o que é privado.

2 respostas

Olá Pedro, tudo bem?

A colocação de dois underscore antes do atributo não o tornaria privado? Ou seja, acessível somente por método (get ou set) da própria classe?

Fiz um teste em console, e ao tentar acessar um atributo diretamente (objeto.atributo), tive o seguinte retorno:

Traceback (most recent call last):
  File "C:\Users\Glauber\AppData\Local\Programs\Python\Python310\lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
AttributeError: 'Date' object has no attribute '__dia'

Ao retirar os dois underscore do atributo, o acesso direto, volta ser permitido.

Ainda não cheguei ao capítulo mencionado em seu post, portanto, pode haver algum conteúdo mais a frente que possa justificar o contrário do que apresentei... rs :)

Na programação orientada a objetos, a convenção de nomenclatura para atributos ou métodos privados é o double "underscore": __ no início do método ou atributo que queira encapsular. Embora no python pelo menos essa convenção seja apenas uma indicação de que o membro é privado não contendo restrições de acesso. Isso nos permite atribuir o nível de acessibilidade dos membros de uma classe, também incentivando a boa prática de seguir esta convenção de usar membros privados apenas dentro da classe.

Enfim, a razão principal de termos acesso a estes membros privados é uma filosofia do Python "we're all consenting adults here": Confiar no bom senso dos desenvolvedores para não acessarem os mesmos, também é permitido o acesso a eles para que se possa acessar e usar membros em situações especiais, como em testes ou em casos de herança e polimorfismo.