Encapsulamiento en la programación orientada a objetos

En la unidad anterior terminamos viendo que teníamos la posibilidad de cambiar los valores de los atributos de un objeto. En muchas ocasiones es necesario que esta modificación no se haga directamente, sino que tengamos utilizar un método para realizar la modificación y poder controlar esa operación. También puede ser deseable que la devolución del valor de los atributos se haga utilizando un método. La característica de no acceder o modificar los valores de los atributos directamente y utilizar métodos para ello lo llamamos encapsulamiento.

Atributos privados

Las variables que comienzan por un doble guión bajo __ la podemos considerar como atributos privados. Veamos un ejemplo:

>>> class Alumno():
...    def __init__(self,nombre=""):
...       self.nombre=nombre
...       self.__secreto="asdasd"
... 
>>> a1=Alumno("jose")
>>> a1.__secreto
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Alumno' object has no attribute '__secreto'

Propiedades: getters y setters

Para implementar la encapsulación y no permitir el acceso directo a los atributos, podemos poner los atributos ocultos y declarar métodos específicos para acceder y modificar los atributos.

  • En Python, las propiedades (getters) nos permiten implementar la funcionalidad exponiendo estos métodos como atributos.
  • Los métodos setters son métodos que nos permiten modificar los atributos a través de un método.

      class circulo():
      	def __init__(self,radio):
      		self.radio=radio
        
      	@property
      	def radio(self):
      		print("Estoy dando el radio")
      		return self.__radio	
        
      	@radio.setter
      	def radio(self,radio):
      		if radio>=0:
      			self.__radio = radio
      		else:
      			print("Radio debe ser positivo")
      			self.__radio=0
    
      >>> c1=circulo(3)
      >>> c1.radio
      Estoy dando el radio
      3
      >>> c1.radio=4
      >>> c1.radio=-1
      Radio debe ser positivo
      >>> c1.radio
      0