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

Autor: Luis Fernando Apáez Álvarez

Clase 5: Método Get y Set

Comencemos por retomar el código de la clase Area de la sesión pasada:

donde, para poder ver los atributos encapsulados creamos el método mostrar_atributos(), no obstante, existe una manera más propia de realizar dicha acción. Más aún, con los métodos que veremos a continuación podremos acceder y modificar los atributos encapsulados; de tal manera, estos métodos se utilizan por la necesidad de acceder y modificar atributos privados.

Métodos Get y Set en Python

El método get (obtener/recuperar) nos permitirá retornar el valor de una variable encapsulada y el método set (fijar) modificar el valor de dicha variable. Estos métodos surgen de la necesidad de poder acceder y modificar variables (o métodos) encapsuladas cuando así lo necesitemos.

Comencemos trabajando con la clase Punto:

versus

print(p1.x)
print(p1.y)

que escribiríamos si los atributos en el constructor de nuestra clase no estuvieran encapsulados. Continuando

versus

p1.x = 2
p1.y = 6

print(p1.x)
print(p1.y)

que escribiríamos si los atributos en el constructor de nuestra clase no estuvieran encapsulados.

Decorador @Property

Un decorador es un patrón de software que se utiliza para alterar el funcionamiento de una determinada pieza de código. El decorador @property se utiliza para modificar un método, para que éste se convierta en un atributo o propiedad. Suele ocuparse cuando se trabaja con los métodos get y set.

Cuando encapsulamos una variable deseamos que no sea accesible desde el exterior de una manera no controlada, al utilizar un método get en conjunto del decorador @property podremos tratar a dicho método como un atributo. La ventaja de esto es que el acceso a dicho atributo será a través de una función (en específico del método get) el cual provee de un acceso controlado. Ahora bien, podemos modificar ahora la parte del `set``:

    def set_x(self, x):
        self.__x = x

    def set_y(self, y):
        self.__y = y

valiéndonos de otro decorador que haga referencia, justamente, al método set. Para ello utilizaremos un decorador que llevará el nombre del atributo (sin guiones bajos) y la palabra setter utilizando la nomenclatura del punto. Esto es

    @x.setter
    def x(self, x):
        self.__x = x

    @y.setter
    def y(self, y):
        self.__y = y

De tal manera podemos modificar el código de la clase Punto como sigue

Es gracias a los decoradores que conseguimos distinguir entre las funcionalidades de los métodos get y set, pues sin éstos caeríamos en el peligro de trabajar con una misma función que realice dos cosas distintas, además una de ellas no pasa parámetros y la otra si. Ahora bien

versus

print(p1.x())
print(p1.y())

que escribíamos sin utilizar decoradores. Continuando

versus

p1.set_x(2)
p1.set_y(6)

print(p1.x())
print(p1.y())

que escribíamos sin utilizar el decorador nombre_del_atributo.setter. Finalmente, podemos modificar el código de la clase Area implementando el conocimiento que hemos adquirido:

Socialmedia.PNG