Estamos dentro de la Encapsulación o Encapsulamientos, vamos a tratar el tema de la ocultación o el ocultamiento de datos.
Ocultando datos desde fuera de la clase pretendemos defender la integridad del objeto.
En este caso la variable pin es accesible desde fuera de la clase.
class Cliente:
def __init__(self):
self.pin = 1234
persona = Cliente()
persona.pin
1234
En este caso la variable __pin no es accesible desde fuera de la clase.
class Cliente:
def __init__(self):
self.__pin = 1234
persona = Cliente()
#persona.__pin # AttributeError: 'Cliente' object has no attribute '__pin'
Podemos crear un método tipo get que desde dentro de la clase acceda a la variable oculta.
class Cliente:
def __init__(self):
self.__pin = 1234
def getPin(self):
return self.__pin
persona = Cliente()
persona.getPin()
1234
El intérprete de Python lo que hace es cambiar el nombre a las variables que llevan un prefijo de doble barra baja. El nuevo nombre es:
Conociendo esta nueva variable si tendremos acceso a su valor desde fuera de la clase.
class Cliente:
def __init__(self):
self.__pin = 1234
persona = Cliente()
persona._Cliente__pin # conociendo la nueva variable no da error
1234
Accediendo, sin problemas, a un método desde fuera de la clase.
class Cliente:
def cuenta(self):
print("Inversión en valores y derivados.")
persona = Cliente()
persona.cuenta() # podemos acceder al método sin problemas
Inversión en valores y derivados.
Los métodos también pueden llevar doble barra baja para intentar protegerse.
Ahora el método cuenta lleva un prefijo de doble barra baja.
Si intentamos acceder ahora desde dura de la clase se producirá un error.
class Cliente:
def __cuenta(self):
print("Inversión en valores y derivados.")
persona = Cliente()
#persona.__cuenta() # AttributeError: 'Cliente' object has no attribute '__cuenta'
El nombre del método ha sido alterado por el intérprete de Python al encontrar el prefijo de doble barra baja. Si conocemos el nuevo nombre podremos seguir accediendo al método que infructuosamente se ha intentado ocultar.
class Cliente:
def __cuenta(self):
print("Inversión en valores y derivados.")
persona = Cliente()
persona._Cliente__cuenta() # conociendo el nuevo nombre del método si accedemos
Inversión en valores y derivados.