Conceitos Básicos de Python: Programação Orientada a Objetos (OOP)
Métodos e Variáveis Privadas
Lesson 5 of 7 • 10 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
Na Programação Orientada a Objetos, nem todos os dados e métodos devem ser acessados diretamente de fora da classe. Às vezes, você quer esconder detalhes internos para que só possam ser usados dentro da própria classe.
Em Python, você pode sinalizar que um atributo ou método é privado iniciando seu nome com dois underscores (__).
Embora isso não torne impossível o acesso, ativa um recurso chamado name mangling, que altera o nome do atributo internamente para dificultar o acesso externo.
Por Que Usar Membros Privados?
Atributos e métodos privados:
- Ajudam a proteger os dados de modificações acidentais.
- Deixam claro quais partes da sua classe são internas e não devem ser usadas por código externo.
- Permitem que você altere a implementação interna sem quebrar outros códigos que usam sua classe.
IMPORTANTE: Privacidade em Python é por convenção, não por força. Membros privados ainda podem ser acessados se alguém realmente tentar, mas a intenção é que você não o faça.
Exemplo: Uma Classe Person
class Person:
def __init__(self, name, age):
self.name = name # Atributo público
self.__age = age # Atributo privado
def print_name(self):
print("Name:", self.name)
def print_info(self):
self.print_name()
self.__print_age() # Chamando método privado de dentro da classe
def __print_age(self): # Método privado
print("Age:", self.__age)
p = Person("John", 30)
p.print_name() # Funciona: Name: John
p.print_info() # Funciona: Name: John Age: 30
O Que Acontece se Você Tentar Acessar um Atributo Privado?
Se tentar acessar um membro privado diretamente de fora da classe, você terá um AttributeError:
p = Person("John", 30)
print(p.__age) # ❌ Isso causará um erro
Por quê?
Porque o Python muda automaticamente o nome __age para _Person__age internamente (name mangling). Isso ajuda a evitar acessos acidentais ou conflitos com subclasses.
Acessando Dados Privados (Se Realmente Precisar)
Tecnicamente, você pode acessar membros privados usando seus nomes modificados:
print(p._Person__age) # 30
Mas isso quebra toda a ideia de manter as coisas privadas — você deve fazer isso apenas em situações raras de depuração, não na lógica normal do programa.
Métodos Privados
Assim como atributos, métodos podem ser privados com dois underscores.
No nosso exemplo, __print_age() é privado — você não pode chamá-lo de fora da classe:
p.__print_age() # ❌ Isso causará um erro
Mas funciona perfeitamente dentro da própria classe, como visto em print_info().
Quando Usar Membros Privados
Use atributos e métodos privados quando:
- Você quer evitar o uso indevido acidental de partes internas da sua classe.
- Precisa controlar como os dados são acessados ou modificados (frequentemente junto com métodos getter e setter).
- Está criando uma separação clara entre a API pública da classe (coisas feitas para serem usadas de fora) e seus detalhes de implementação.
Concluindo
Membros privados em Python:
- Começam com
__(dois underscores). - São destinados ao uso interno somente.
- Ainda podem ser acessados via name mangling, mas você deve respeitar essa privacidade.
Eles são um sinal para outros programadores (e para você no futuro!) sobre o que é seguro usar e o que é um detalhe interno que pode mudar sem aviso.