La encapsulación con Python es hacer inaccesibles desde fuera los atributos y métodos que necesitemos de una clase determinada, de esta forma protegeremos la integridad del objeto.
Encapsulando atributos y métodos en Python
Para encapsular utilizaremos doble guión bajo __ seguido del nombre de la variable o método, Python internamente cambiará el nombre para que esté inaccesible. Si queremos desencapsular llamaremos a una función con el nombre get + el nombre de la variable.
Encapsulando una propiedad con Python
Encapsularemos la variable secreto agregando doble guión bajo delante → __secreto . Luego intentaremos acceder a la propiedad de nuestro objeto como hacemos siempre, veremos que recibimos un error.
class Consolas:
def __init__(self):
self.__secreto = 123456789
mi_consola = Consolas()
print(mi_consola.__secreto)
# AttributeError: 'Consolas' object has no attribute '__secreto'
Ahora crearemos una función que comience por la palabra get seguida del nombre de la propiedad que tenemos encapsulada, quedando el nombre de la siguiente forma → get__secreto(). Este método lo único que hace es retornar el valor desencapsulado.
class Consolas:
def __init__(self):
self.__secreto = 123456789
def get__secreto(self):
return self.__secreto
mi_consola = Consolas()
print(mi_consola.get__secreto())
# 123456789
Encapsulando un método con Python
Ahora vamos a encapsular un método de una clase.
Para encapsular un método utilizaremos de la misma forma que para los atributos el doble guión bajo __ seguido del nombre del método. Si intentamos acceder al método sin haber desencapsulado obtendremos un error.
class Consolas:
def __init__(self):
self.__secreto = 123456789
def __metodo_secreto(self):
return f'Esta información es secreta'
mi_consola = Consolas()
print(mi_consola.__metodo_secreto())
# AttributeError: 'Consolas' object has no attribute '__metodo_secreto'
Necesitamos desencapsular nuestro método para poder acceder a él desde fuera. La forma de hacerlo es muy sencilla, únicamente debemos colocar delante de la llamada al método guión bajo seguido del nombre de la clase _clase__metodo.
class Consolas:
def __init__(self):
self.__secreto = 123456789
def __metodo_secreto(self):
return f'Esta información es secreta'
mi_consola = Consolas()
print(mi_consola._Consolas__metodo_secreto())
# Esta información es secreta