Curso de introducción a la programación con Python

Autor: Luis Fernando Apáez Álvarez

Clase4: Encapsulamiento

Comenzaremos viendo un ejemplo de una clase, la cual calculará el área de un rectángulo. Para ello

Ahora bien, como mencionamos en la clase pasada, no es una buena práctica permitir la modificación de atributos, como por ejemplo

pues en muchos casos realizar estas acciones podrá traer grandes problemas en el resto del código. Por ejemplo, al calcular ahora el área del rectángulo tendremos que ésta ha cambiado

la cual ya no representa el área del rectángulo 1 el cual tiene de dimensiones $base = 5$ y $altura=4$.

De tal manera surge la necesidad de proteger (o encapsular) una propiedad para que no que pueda modificarse desde fuera de la clase.

Encapsulando atributos

Ahora bien, hasta el momento, los atributos que hemos manejado en nuestras clases se conocen como atributos públicos, los cuales pueden se consultados y/o modificados fuera de la propia clase. Si deseamos tener atributos que sólo puedan usarse o modificarse dentro de la clase, es decir de atributos privados, entonces utilizaremos un guón bajo como prefijo al atributo. Por ejemplo, podemos modificar el código de nuestro ejemplo inicial para hacer que los atributos en el constructor sean privados:

de esta manera indicaremos a cualquier desarrollador que dichos atributos deben de tratarse como privados y que no deben de ser expuestos o modificados externamente. Cabe aclarar que lo anterior es tan sólo una convención pues, de hecho, aún después de hacer que los atributos sean privados agregando el guión bajo podemos modificarlos externamente. Por ejemplo

El detalle radica en que para Python no hay como tal atributos públicos o privados, de tal manera el guión bajo funge como una convención para el intento de manejo de los atributos privados y para trabajar con éstos.

Existe una alternativa para evitar (ahora si) el acceso y modificación de los atributos fuera de la propia clase, la cual radica en colocar doble guión bajo como prefijo. Aunque la función original del doble guión bajo no es la encapsulación, es muy frecuente su utilización para dicho fin. Veamos

con lo anterior no podremos acceder a los atributos base y altura con lo cual, al intentar acceder a ellos, obtendremos un error

sin embargo si podremos conocer el área de dicho rectángulo, de modo que los atributos dentro de la propia clase funcionan de forma habitual

Si bien lo anterior puede presentar como primer inconveniente el no poder "ver" los valores de los atributos de nuestro objeto r2, podemos solucionarlo creando un método para mostrarlos:

Para finalizar es preciso mencionar que las variables r2.base, r2._base y r2.__base son todas distintas y sólo r2.__base hace alusión al atributo definido de la clase.

Socialmedia.PNG