Private, _, __ | Python
- Private,
_,__| Python
Em Python, não existe privacidade “real” como em linguagens como Java ou C++ — mas há convenções e mecanismos que servem para indicar e proteger o acesso a atributos e métodos internos.
Vamos ver os níveis de “privacidade”:
🔹 1. Convenção: prefixo com _ (um sublinhado)
Um atributo que começa com _ é considerado “protegido” — ou seja, não deve ser acessado diretamente fora da classe, mas ainda pode ser.
class Pessoa:
def __init__(self, nome):
self._nome = nome # atributo “protegido”
p = Pessoa("Ana")
print(p._nome) # possível, mas não recomendado
👉 É apenas uma convenção, não há bloqueio real.
🔹 2. “Name Mangling”: prefixo com __ (dois sublinhados)
Quando você usa dois sublinhados, o Python altera o nome internamente para evitar acessos acidentais.
class Pessoa:
def __init__(self, nome):
self.__nome = nome # atributo “privado”
def mostrar_nome(self):
return self.__nome
Agora:
p = Pessoa("Ana")
print(p.mostrar_nome()) # ✅ correto
print(p.__nome) # ❌ erro: atributo não acessível diretamente
Mas ainda é possível acessar se você souber o nome transformado (“mangled”):
print(p._Pessoa__nome) # ⚠️ funciona, mas NÃO recomendado
O Python renomeia __nome → _NomeDaClasse__nome.
🔹 3. Combinar com @property
Geralmente, combinamos atributos privados com propriedades para controlar o acesso:
class Pessoa:
def __init__(self, nome):
self.__nome = nome
@property
def nome(self):
return self.__nome
@nome.setter
def nome(self, novo_nome):
if not novo_nome:
raise ValueError("O nome não pode ser vazio!")
self.__nome = novo_nome
Uso:
p = Pessoa("Ana")
print(p.nome) # acessa via getter
p.nome = "João" # usa setter
🔹 4. Resumo rápido
| Forma | Exemplo | Nível de proteção | Observação |
|---|---|---|---|
| Público | self.nome | Nenhum | livre acesso |
| Protegido | self._nome | Convenção | “uso interno” |
| Privado | self.__nome | Forte (name mangling) | evita conflitos e acessos acidentais |