Os modificadores de acesso são um conceito fundamental na Programação Orientada a Objetos (POO) que define como os atributos e métodos de uma classe podem ser acedidos. Em Python, existem três níveis principais de acesso: público, privado e protegido.
Público
Em Python, por defeito, todos os atributos e métodos de uma classe são públicos. Isto significa que podem ser acedidos a partir de qualquer lugar, dentro e fora da classe.
class Pessoa:
def __init__(self, nome, idade):
self.nome = nome
self.idade = idade
pessoa = Pessoa("João", 30)
print(pessoa.nome) # Saída: João
print(pessoa.idade) # Saída: 30
Privado
Atributos e métodos privados são utilizados quando se pretende esconder a implementação interna de uma classe. Para criar um atributo ou método privado em Python, usa-se dois underscores (__
) no início do nome.
class Pessoa:
def __init__(self, nome, idade):
self.__nome = nome
self.__idade = idade
def __mostrar_nome(self):
return self.__nome
pessoa = Pessoa("João", 30)
# print(pessoa.__nome) # Erro: AttributeError
# print(pessoa.__mostrar_nome()) # Erro: AttributeError
Note que tentar aceder aos atributos ou métodos privados resultará num erro AttributeError
. No entanto, é possível aceder a estes atributos através de "name mangling":
print(pessoa._Pessoa__nome) # Saída: João
print(pessoa._Pessoa__mostrar_nome()) # Saída: João
Este método deve ser evitado, pois contraria o propósito da privacidade dos dados.
Protegido
Atributos e métodos protegidos são indicados com um underscore (_
) no início do nome. Estes são convencionados como não sendo pretendidos para serem acedidos fora da classe e das suas subclasses.
class Pessoa:
def __init__(self, nome, idade):
self._nome = nome
self._idade = idade
pessoa = Pessoa("João", 30)
print(pessoa._nome) # Saída: João
print(pessoa._idade) # Saída: 30
Embora não seja recomendável aceder a atributos protegidos fora da classe ou das suas subclasses, este nível de acesso é mais sobre convenção do que sobre restrição técnica.
Resumo
Os modificadores de acesso são essenciais para controlar a forma como os dados e métodos de uma classe são utilizados e modificados.
- Público: Pode ser acedido de qualquer lugar.
- Privado: Pode ser acedido apenas dentro da própria classe.
- Protegido: Pode ser acedido dentro da classe e das suas subclasses, mas não é recomendado aceder fora destas.
Quiz
- O que acontece se tentar aceder a um atributo privado diretamente fora da classe?
- Como se denota um método protegido em Python?
- Qual é a principal diferença entre um atributo protegido e um atributo privado?
Responda a estas perguntas para reforçar o seu entendimento sobre modificadores de acesso em Python.