Modificadores de Acesso
Parte da seção Object Oriented Programming do Journey de Python da Coddy — lição 29 de 64.
Modificadores de acesso controlam a visibilidade de atributos e métodos de classe. O Python utiliza convenções de nomenclatura em vez de palavras-chave para o controle de acesso.
Aqui está um exemplo de acesso público (sem prefixo):
class Person:
def __init__(self):
self.name = "Coddy" # Atributo público
def greet(self): # Método público
return f"Hello, I'm {self.name}"Acesse membros públicos de qualquer lugar:
person = Person()
print(person.name) # Coddy
print(person.greet()) # Olá, eu sou o CoddyAqui está um exemplo de acesso protegido (sublinhado único):
class Employee:
def __init__(self):
self._salary = 50000 # Atributo protegido
def _calculate_bonus(self): # Método protegido
return self._salary * 0.1
def show_bonus(self):
return self._calculate_bonus() # OK para usar dentro da classeAcesse membros protegidos (funciona, mas não é recomendado):
employee = Employee()
print(employee._salary) # 50000 - funciona, mas é desencorajado
print(employee.show_bonus()) # 5000.0 - maneira corretaAqui está um exemplo de acesso privado (sublinhado duplo):
class User:
def __init__(self):
self.__password = "secure123" # Atributo privado
def __encrypt(self, data): # Método privado
return f"Encrypted: {data}"
def verify(self, input_password):
# Membros privados acessíveis dentro da classe
return input_password == self.__passwordUse membros privados corretamente:
user = User()
print(user.verify("secure123")) # True - usando método público
# print(user.__password) # AttributeError - não é possível acessar diretamenteSaída:
Coddy
Hello, I'm Coddy
50000
5000.0
TruePonto Chave: Os modificadores de acesso do Python são convenções de nomenclatura: sem prefixo = public (acessível em qualquer lugar), sublinhado único = protected (uso interno), sublinhado duplo = private (apenas para a classe). Eles ajudam a estabelecer limites claros e evitam o uso indevido acidental dos componentes internos da classe.
Desafio
MédioNeste desafio, você implementará uma classe FileManager que demonstra os modificadores de acesso do Python (público, protegido e privado) enquanto experimenta os benefícios de testes abrangentes.
Edite filemanager.py para implementar a classe FileManager seguindo os comentários TODO. O arquivo contém instruções detalhadas para implementar:
- Métodos públicos para operações de arquivo
- Métodos protegidos (com prefixo de sublinhado único)
- Métodos privados (com prefixo de sublinhado duplo)
- Interações de métodos demonstrando encapsulamento
Folha de consulta
O Python usa convenções de nomenclatura para controle de acesso:
Acesso público (sem prefixo) - acessível em qualquer lugar:
class Person:
def __init__(self):
self.name = "Coddy" # Atributo público
def greet(self): # Método público
return f"Hello, I'm {self.name}"
person = Person()
print(person.name) # Coddy
print(person.greet()) # Hello, I'm CoddyAcesso protegido (sublinhado único) - uso interno, desencorajado por fora:
class Employee:
def __init__(self):
self._salary = 50000 # Atributo protegido
def _calculate_bonus(self): # Método protegido
return self._salary * 0.1
employee = Employee()
print(employee._salary) # Funciona, mas é desencorajadoAcesso privado (sublinhado duplo) - apenas para a classe:
class User:
def __init__(self):
self.__password = "secure123" # Atributo privado
def __encrypt(self, data): # Método privado
return f"Encrypted: {data}"
def verify(self, input_password):
return input_password == self.__password
user = User()
print(user.verify("secure123")) # True - usando método público
# print(user.__password) # AttributeError - não é possível acessar diretamenteExperimente você mesmo
from file_manager import FileManager
# Manipulador abrangente de casos de teste
test_case = input()
if test_case == "basic_test":
# Cria uma instância de FileManager
manager = FileManager()
# Chama o método read_file
print(manager.read_file("example.txt"))
# Chama o método get_file_content
print(manager.get_file_content("example.txt"))
elif test_case == "protected_access":
# Cria uma instância de FileManager
manager = FileManager()
# Tenta chamar o método protegido
# Métodos protegidos são acessíveis, mas destinados ao uso interno
print(manager._check_permissions("example.txt"))
print("Note: Protected methods are accessible but intended for internal use only")
elif test_case == "private_access":
# Cria uma instância de FileManager
manager = FileManager()
try:
# Tenta chamar o método privado diretamente
print(manager.__decrypt_content("some content"))
except AttributeError as e:
print(f"Error: {e}")
print("Private methods are name-mangled and cannot be accessed directly")
# Acesso usando a forma de name-mangling
print(manager._FileManager__decrypt_content("some content"))
print("Note: Accessed private method using name-mangled form")
elif test_case == "method_chaining":
# Cria uma instância de FileManager
manager = FileManager()
# Demonstra como get_file_content chama internamente métodos protegidos e privados
print("Calling get_file_content which internally uses protected and private methods:")
print(manager.get_file_content("example.txt"))
elif test_case == "multiple_files":
# Cria uma instância de FileManager
manager = FileManager()
# Processa múltiplos arquivos
files = ["document.txt", "image.jpg", "data.csv"]
for file in files:
print(f"\
Processing {file}:")
print(manager.read_file(file))
print(manager.get_file_content(file))
elif test_case == "name_mangling":
# Cria uma instância de FileManager
manager = FileManager()
# Demonstra name mangling
print("Python's name mangling for private methods:")
print("Attempting direct access would fail with AttributeError")
print("Using mangled name:")
print(manager._FileManager__decrypt_content("private data"))
print("\
Name mangling is Python's mechanism to prevent accidental access")
print("It renames __method to _ClassName__method internally")Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Object Oriented Programming
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosO Parâmetro selfMétodosAtributosMétodo Construtor (__init__)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Função super()Sobrescrita de MétodoHerança MúltiplaOrdem de Resolução de MétodosRecapitulação - Hierarquia de Funcionários7Métodos Especiais
Introdução aos Métodos MágicosSobrecarga de OperadoresMétodos Mágicos de ContêinerRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução a Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy2Decoradores
Introdução aos DecoradoresDecorador de PropriedadeDecorador de Método EstáticoDecorador de Método de Classe5Polimorfismo
Sobrescrita de Método RevisitadaDuck TypingClasses e Métodos AbstratosDesign de InterfacesRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição vs HerançaMixinsMétodos Estáticos e de ClasseDecoradores de ClasseGerenciadores de Contexto11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Propriedades de Classe
Variáveis de Instância vs de ClasseDecoradores de PropriedadeAtributos PrivadosRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Membros Públicos, Protegidos e PrivadosModificadores de AcessoOcultação de InformaçãoProperty Decorators AvançadosRecapitulação - Sistema de Registro de Alunos12Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário