Skip to main content

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

FormaExemploNível de proteçãoObservação
Públicoself.nomeNenhumlivre acesso
Protegidoself._nomeConvenção“uso interno”
Privadoself.__nomeForte (name mangling)evita conflitos e acessos acidentais