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.

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..

  2. 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..

  3. 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..

  4. 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: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

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