Variables Privadas en Clases

Las clases en Python nos permiten organizar el código encapsulando datos y funciones relacionadas. En algunos casos, podríamos querer prohibir el uso de variables desde fuera de la clase. Python permite tener variables privadas en las clases para evitar que los usuarios del código accedan a esas variables. Las variables privadas se definen colocando dos guiones bajos al inicio del nombre de la variable (__). Mientras que las variables públicas pueden ser accedidas directamente desde fuera de la clase, las variables privadas no pueden. Ilustremos esto:
class PublicPrivateExample:
    def __init__(self):
        self.public_var = 'I am public!'      # Variable pública
        self.__private_var = 'I am private!'  # Variable privada

example = PublicPrivateExample()
print(example.public_var)                     # 'I am public!'
print(example.__private_var)                  # Genera AttributeError
En este caso, podemos ver que la variable pública es fácilmente accesible. Sin embargo, si intentamos acceder a la variable privada, Python generará un AttributeError.
Python no tiene miembros privados estrictos como otros lenguajes como Java o C++. En Python, un miembro privado es simplemente una convención que sugiere no acceder al miembro directamente. Python utiliza modificación de nombres (name mangling) para hacer menos probable el acceso o modificación accidental de una variable privada. Sin embargo, aún puedes acceder a ella si lo necesitas, aunque generalmente se desaconseja:
print(example._PublicPrivateExample__private_var)  # I am private!
El acceso a la variable privada se realiza usando _ClassName__private_var. Esto desanima su acceso directo y fomenta la encapsulación. Deberías proporcionar métodos públicos si quieres brindar acceso a variables privadas:
class PublicPrivateExample:
    def __init__(self):
        self.__private_var = 'I am private!'

    def get_private_var(self):      # Método getter para la variable privada
        return self.__private_var   # Podemos acceder a campos privados dentro de la clase

example = PublicPrivateExample()
print(example.get_private_var())    # Imprimirá 'I am private!'
Aquí usamos un método público get_private_var para proporcionar una forma controlada de acceder a nuestra variable privada. De esta manera, mantenemos la encapsulación y la integridad de nuestros datos.
💭
Ten en cuenta que usar variables privadas es parte de la práctica de la encapsulación, que es uno de los fundamentos de la Programación Orientada a Objetos. Protege los datos de ser modificados y accedidos inesperadamente. Así que, aunque Python no imponga estrictamente las variables privadas, es una buena práctica usarlas para que tu código sea más mantenible y libre de errores.

Desafío: Clase de Base de Datos

Se te pide desarrollar una clase Database en Python que almacene pares name: value. La base de datos debe estar representada como un diccionario privado dentro de la clase Database.
La clase Database debe tener los siguientes métodos:
  1. insert(name, value): Este método debe insertar un nuevo par name: value en la base de datos. Si el name ya existe en la base de datos, debe imprimir un mensaje que diga Name already exists in the database..
  1. delete(name): Este método debe eliminar un par name: value existente de la base de datos. Si el name no existe, debe imprimir un mensaje que diga Name does not exist in the database..
  1. update(name, value): Este método debe actualizar el value de un name existente en la base de datos. Si el name no existe, debe imprimir un mensaje que diga Name does not exist in the database..
  1. display(): Este método debe mostrar todos los pares name: value en la base de datos en el formato name: value. Todos los valores deben estar separados por una coma y un espacio (, ).
Entrada
Salida
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