1
resposta

Convenção sobre o underscore

Estava lendo um pouco mais sobre a utilização do underscore no Python, nos atributos e acabei caindo neste artigo: https://www.alura.com.br/apostila-python-orientacao-a-objetos/encapsulamento

Em um certo momento explicao seguinte:

"O prefixo com apenas um underscore não tem significado para o interpretador quando usado em nome de atributos, mas entre programadores Python é uma convenção que deve ser respeitada. O programador alerta que esse atributo não deve ser acessado diretamente:"

def __init__(self, idade):
    self._idade = idade

Neste caso, não trata-se de uma má prática certo, posso realmente utilizar somente um underscore, pelo que notei com um ou dois underscore o python continua entendendo que é um atributo privado:

class Conta:

    def __init__(self, numero_conta, titular, saldo, limite):
        self._numero_conta = numero_conta
        self._titular = titular
        self._saldo = saldo
        self._limite = limite

Print de execução:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Olá, Willian!

Você está absolutamente correto em sua observação. No Python, o uso de um único underscore (_) antes do nome de um atributo, como em _idade, é uma convenção entre os desenvolvedores que sinaliza que o atributo é protegido e não deve ser acessado diretamente fora da classe. Isso não é reforçado pelo interpretador Python, mas é uma prática comum que outros desenvolvedores Python reconhecem e respeitam.

Já o uso de dois underscores (__) antes do nome de um atributo, como em __saldo, é uma funcionalidade da linguagem Python que altera o nome do atributo para incluir o nome da classe (name mangling), o que dificulta seu acesso de fora da classe. Ainda é possível acessá-lo, mas o Python sinaliza que você está acessando um atributo que deveria ser tratado como privado, como você observou com conta._Conta__saldo.

Portanto, não é uma má prática usar um único underscore para atributos protegidos. É uma forma de dizer aos outros desenvolvedores que esses atributos devem ser tratados com cuidado e preferencialmente não acessados diretamente. O uso de dois underscores é mais forte e serve para quando você quer realmente desencorajar o acesso direto aos atributos, o que é uma forma de aplicar o princípio do encapsulamento.

Na imagem que você enviou, podemos ver que o interpretador Python está exibindo os atributos protegidos da classe Conta, indicando que eles têm um único underscore e o nome da classe como prefixo (por exemplo, _Conta__limite). Isso confirma que o Python realiza o name mangling para atributos com dois underscores, mas eles ainda são acessíveis se você souber o nome alterado.

Espero ter ajudado e bons estudos!