Si alguna de las propiedades iniciales del objeto declaradas en el constructor no deseamos que se puedan llegar a alterar será necesario recurrir al concepto de encapsulación.
La encapsulación impide que las propiedades de un objeto se puedan modificar desde fuera de la clase.
La encapsulación es optativa: en ocasiones nos interesará encapsular una propiedad del objeto definida en el constructor y en otras ocasiones no interesará encapsular otra propiedad.
Se encapsula precediendo el nombre de la variable con dos guiones bajos __
Así conseguimos que, la propiedad ruedas no sea accesible (modificable) desde fuera de la clase, pero si será accesible desde dentro de la propia clase.
Esto supone que si hemos encapsulado la variable ruedas, cada vez que usemos esta variable desde dentro de la clase, la usaremos con los dos guiones bajos precediendo al nombre de la variable:
class Coche():
def __init__(self):
self.largo = 426
self.ancho = 181
self.__ruedas = 4 # encapsulamos la variable ruedas poniendo dos barras bajas __ que anteceden a la variable
self.enmarcha = False
def arrancar(self, arrancamos):
self.enmarcha = arrancamos
if self.enmarcha:
return "El coche está en marcha"
else:
return "El coche está parado"
def estado(self): # para acceder al atributo ruedas debemos ponerlo precedido por dos barras bajas
print(f"El coche tiene {self.__ruedas} ruedas, un ancho de {self.ancho} y un largo de {self.largo}.")
miCoche = Coche()
print(miCoche.arrancar(True))
miCoche.ruedas = 6 # aunque se pongan los dos guiones bajos sigue sin funcionar la asignación
miCoche.estado()
El coche está en marcha El coche tiene 4 ruedas, un ancho de 181 y un largo de 426.
Pese a que hemos dicho que el coche tiene 6 ruedas, no lo ha considerado y vemos que se imprime que tiene 4 ruedas. Esto se debe a que la propiedad ruedas está encapsulada y no es accesible desde fuera de la clase.
Podemos encapsular la propiedad 'enmarcha' y luego podemos modificar su valor desde fuera de la clase. ¿Cómo es posible esto?
Esto es posible, ya que el valor de la propiedad 'enmarcha' si está siendo modificada desde dentro de la clase debido a que se modifica en el método 'arrancar'.
class Coche():
def __init__(self): # aquí se crea el constructor
self.__largo = 426 # las propiedades llevan un self. que las antecede
self.__ancho = 181
self.__ruedas = 4
self.__enmarcha = False
def arrancar(self, arrancamos):
self.__enmarcha = arrancamos # La variable enmarcha será True o False según lo que nos pasen por el parámetro arrancamos
if self.__enmarcha:
return "El coche está en marcha"
else:
return "El coche está parado"
def estado(self):
print(f"El coche tiene {self.__ruedas} ruedas, un ancho de {self.__ancho} y un largo de {self.__largo}.")
miCoche = Coche()
print(miCoche.arrancar(True)) # aquí modificamos la propiedad 'enmarcha' que está encapsulada gracias al método 'arrancar'
miCoche.estado()
El coche está en marcha El coche tiene 4 ruedas, un ancho de 181 y un largo de 426.
La propiedad 'enmarcha', pese a estar encapsulada, si hemos conseguido modificarla, pero esto ha sido posible a través del método 'arrancar' que actúa internamente dentro de la clase. Pero desde fuera de la clase, directamente ya no es posible acceder a la propiedad 'enmarcha'.