As classes em Python permitem-nos organizar o código, encapsulando dados e funções relacionadas. Em alguns casos, podemos querer proibir o uso de certas variáveis fora da classe. O Python permite ter variáveis privadas nas classes para impedir que os utilizadores do código acedam a essas variáveis. As variáveis privadas são definidas adicionando 2 sublinhados no início do nome da variável (__). Enquanto as variáveis públicas podem ser acedidas diretamente fora da classe, as variáveis privadas não podem. Vamos ilustrar isto:
class PublicPrivateExample:
def __init__(self):
self.public_var = 'I am public!' # Variável pública
self.__private_var = 'I am private!' # Variável privada
example = PublicPrivateExample()
print(example.public_var) # 'I am public!'
print(example.__private_var) # Levanta AttributeError
Neste caso, podemos ver que a variável pública é facilmente acessível. No entanto, se tentarmos aceder à variável privada, o Python irá levantar um AttributeError.
O Python não tem membros privados estritos como outras linguagens como Java ou C++. Em Python, um membro privado é simplesmente uma convenção que sugere não aceder diretamente ao membro. O Python utiliza name mangling (ofuscação de nomes) para tornar menos provável o acesso ou modificação acidental de uma variável privada. No entanto, ainda pode acedê-la se necessitar, embora seja geralmente desencorajado:
print(example._PublicPrivateExample__private_var) # I am private!
O acesso à variável privada é realizado usando _ClassName__private_var. Isto desencoraja o seu acesso direto e promove a encapsulação. Deve fornecer métodos públicos se quiser disponibilizar acesso a variáveis privadas:
class PublicPrivateExample:
def __init__(self):
self.__private_var = 'I am private!'
def get_private_var(self): # Método getter para variável privada
return self.__private_var # Podemos aceder a campos privados dentro da classe
example = PublicPrivateExample()
print(example.get_private_var()) # Vai imprimir 'I am private!'
Aqui, usamos um método público get_private_var para fornecer uma forma controlada de aceder à nossa variável privada. Desta forma, mantemos a encapsulação e a integridade dos nossos dados.
💭
Tenha em mente que usar variáveis privadas faz parte da prática de encapsulamento, que é um dos fundamentos da Programação Orientada a Objetos. Isso protege os dados de serem alterados e acedidos inesperadamente.
Assim, mesmo que o Python não imponha estritamente variáveis privadas, é boa prática utilizá-las para tornar o seu código mais fácil de manter e livre de erros.
Desafio: Classe Database
Foi-lhe pedido que desenvolvesse uma classe Database em Python que armazena pares name: value. A base de dados deve ser representada como um dicionário privado dentro da classe Database.
A classe Database deve ter os seguintes métodos:
insert(name, value): Este método deve inserir um novo par name: value na base de dados. Se o name já existir na base de dados, deve imprimir uma mensagem dizendo Name already exists in the database..
delete(name): Este método deve eliminar um par name: value existente na base de dados. Se o name não existir, deve imprimir uma mensagem dizendo Name does not exist in the database..
update(name, value): Este método deve atualizar o value de um name existente na base de dados. Se o name não existir, deve imprimir uma mensagem dizendo Name does not exist in the database..
display(): Este método deve exibir todos os pares name: value na base de dados no formato name: value. Todos os valores devem ser separados por uma vírgula e um espaço (, ).