Variáveis Privadas em Classes

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:
  1. 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..
  1. 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..
  1. 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..
  1. 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 (, ).
Entrada
Saída
db = Database(); db.insert('Bob', 23); db.insert('Alice', 25); db.update('Bob', 24); db.display(); db.delete('Alice'); db.display();
Bob: 24, Alice: 25 Bob: 24
 

Constraints

Time limit: 1 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue