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: