La encapsulación con Python consiste en hacer inaccesibles desde fuera los atributos y métodos que necesitemos de una clase determinada para proteger 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. Para desencapsular, llamaremos a la función get seguido del nombre de la variable.
Encapsulando una propiedad con Python
Para encapsular la variable secreto agregaremos doble guión bajo delante __secreto. Al intentar acceder 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, y el nombre quedará 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
A continuación vamos a encapsular un método de una clase.
Para encapsular un método, utilizaremos el doble guión bajo __ seguido del nombre del método, como hicimos con los atributos anteriormente. 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 un 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