Aula 6: Modificadores de Acesso (Convenção em Python)

Controlando a visibilidade dos atributos.

O Que Você Vai Aprender

Nesta aula, você entenderá como Python lida com a visibilidade de atributos em classes, através das convenções de modificadores de acesso. Você aprenderá a distinguir entre atributos públicos, protegidos (com um `_` underscore) e privados (com dois `__` underscores), e como essas convenções afetam a forma como os dados de um objeto devem ser acessados e manipulados.

🌐 Atributos Públicos

Compreender o acesso irrestrito a atributos.

⚠️ Atributos Protegidos (`_`)

Entender a convenção para indicar uso interno da classe ou subclasses.

🚫 Atributos Privados (`__`)

Aprender sobre o "name mangling" e a dificuldade de acesso externo.

Público: Acesso Irrestrito

Por padrão, todos os atributos e métodos em Python são públicos. Isso significa que eles podem ser acessados e modificados de qualquer lugar no seu código, tanto dentro quanto fora da classe. Em Python, a ideia de "público" é implícita quando não há prefixos especiais no nome do atributo.

Exemplo de Atributo Público

class Carro:
    def __init__(self, marca, modelo):
        self.marca = marca   # Atributo público
        self.modelo = modelo # Atributo público

meu_carro = Carro("Toyota", "Corolla")
print(meu_carro.marca)  # Acesso direto e permitido
meu_carro.modelo = "Hilux" # Modificação direta e permitida
print(meu_carro.modelo)

Protegido (`_`): Uma Convenção

Atributos e métodos precedidos por um único underscore (`_`) são considerados protegidos. Em Python, isso é apenas uma convenção para indicar que o atributo ou método é destinado para uso interno da classe ou de suas subclasses. Não há nenhuma restrição técnica imposta: você ainda pode acessá-lo de fora, mas o bom senso de programação sugere que você não o faça diretamente.

Exemplo de Atributo Protegido

class Usuario:
    def __init__(self, nome, idade):
        self.nome = nome
        self._idade = idade # Atributo protegido por convenção

minha_conta = Usuario("Ana", 25)
print(minha_conta.nome)    # Acesso público normal
print(minha_conta._idade)  # Acesso direto (desencorajado, mas possível)

# Modificações também são possíveis, mas não recomendadas diretamente
minha_conta._idade = 26
print(minha_conta._idade)

Privado (`__`): Name Mangling

Atributos e métodos precedidos por dois underscores (`__`) são considerados privados. Em Python, isso não é um "privado" como em outras linguagens (onde o acesso é estritamente proibido). Em vez disso, o Python realiza um processo chamado "name mangling".

Como Funciona o Name Mangling

O Python renomeia o atributo internamente para `_NomeDaClasse__nome_do_atributo`. Isso torna o acesso direto de fora da classe muito mais difícil e serve como um forte sinal de que o atributo não deve ser acessado ou modificado externamente.

class MinhaConta:
    def __init__(self, saldo_inicial):
        self.__saldo = saldo_inicial # Atributo privado

    def ver_saldo(self):
        return self.__saldo # Acesso normal dentro da classe

conta = MinhaConta(100)
# print(conta.__saldo) # Isso geraria um AttributeError! (acesso direto falha)

print(conta.ver_saldo()) # Acesso via método (correto)

# Acessando via name mangling (desencorajado e para propósitos de debug/avanço)
# print(conta._MinhaConta__saldo) # Funciona, mas não é a forma recomendada

Simulador: Modificadores de Acesso

Experimente acessar e modificar atributos com diferentes níveis de visibilidade em uma classe `Configuracao`.

Classe `Configuracao` (simulada)

class Configuracao:
    def __init__(self, publico, protegido, privado):
        self.publico_attr = publico
        self._protegido_attr = protegido
        self.__privado_attr = privado

    def get_privado(self):
        return self.__privado_attr

    def set_privado(self, novo_valor):
        self.__privado_attr = novo_valor
        print("Atributo privado modificado via setter.")

Interagindo com a `Configuracao`

Atributos atuais: