Oii Bruno, como você está? Espero que esteja bem ^-^
Não tem problema manter com o duplo underline. Mas é importante que você deixe todos com duplo underline ou todos com único underline, para manter a consistência e não virar uma salada hahaha
Qual a diferença ao usar um atributo com duplo ou com um único underline?
Em Python, por mais que expressemos que o atributo é privado seja por meio de um ou dois underlines, conseguiremos acessar o atributo fora da classe, ou seja, em Python não conseguimos ter um atributo que seja 100% privado.
A diferença entre um atributo que possui um underline para o que possui dois underlines é a forma para acessarmos o mesmo fora da classe.
- Imagine a seguinte classe
Animal
:
class Animal:
def __init__(self):
self.__cachorro = "Bob"
self._gato = "Mimi"
Observe que o atributo _gato possui apenas um único underline e para acessá-lo fora da classe, podemos fazer o seguinte código:
>> print(objeto._gato)
>> Mimi
E se acessarmos o atributo com duplo underline (__cachorro
)?
>> print(objeto.__cachorro)
>> AttributeError: 'Animal' object has no attribute '__cachorro'
Observe que foi nos retornado que a classe Animal
não possui esse atributo. E isso ocorre porque quando utilizamos duplo underline em um atributo ocorre um fenômeno chamado name mangling que se refere ao Python modificar o nome do atributo para dificultar o seu acesso direto e também, para evitar conflitos de nomes em subclasses, então qualquer variável dentro da classe no formato __variavel
será substituído por _nomedaclasse__variavel
. Sendo assim, para acessarmos a variável __cachorro
fora da classe teríamos que utilizar a seguinte sintaxe:
>> print(objeto._Animal__cachorro)
>> Bob
Qual é melhor utilizar?
Segundo a documentação da linguagem, a convenção é um único underscore(_atributo). Abaixo, um pequeno trecho da documentação:
"Variáveis de instância “privadas”, que não podem ser acessadas, exceto em métodos do próprio objeto, não existem em Python. No entanto, existe uma convenção que é seguida pela maioria dos programas em Python: um nome prefixado com um sublinhado (por exemplo: _spam )"
Lembrando que são apenas exemplos para evidenciar que mesmo o atributo sendo "privado", conseguiremos acessá-los fora da classe. O modo correto de acessarmos os atributos fora da classe é por meio das propertys que você aprendeu ao longo do curso.
Qualquer dúvida estou por aqui, tá bom?
Grande abraço!