Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Herança e atributos privados

Eu escrevi o código exatamente igual foi proposto, porém eu não modifiquei os atributos privados (tudo continuou com dois underlines como estava inicialmente. EX: self.__nome = nome). No vídeo, quando o professor não trocou, o código até gerou um erro por causa disso, mas o meu funcionou perfeitamente. Tem problema manter o código assim com o duplo underline? Ou eu devo deixar apenas com 1 pra evitar problemas futuros?

1 resposta
solução!

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!

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