Anuncios

Bienvenidos sean a este post, hoy veremos como establecer un decorador para propiedades.

Anuncios
Anuncios

Para entender el concepto de decoradores de propiedades vamos a suponer un ejemplo donde tenemos una clase que posee una variable que almacena la edad pero necesitamos que se restrinja a un rango de edad, para lograr esto podemos hacerlo por un procedimiento muy comun llamado getter and setter donde se establece una serie de metodos para conseguir (get) y otras series de metodos para establecer (set) pero esto puede ser algo tedioso si tenemos que repetirlo con muchas variables, aunque es verdad que ciertas IDE (Entornos de Desarrollo Integrados por sus siglas en ingles) de Java, por ejemplo, nos facilitan ciertas herramientas para hacer esta tarea por nosotros pero sino disponemos de esta herramienta deberemos hacerlo a mano pero afortunadamente el lenguaje posee una herramienta que nos facilita esta tarea llamada property, para entender este concepto vamos a realizar el siguiente ejemplo y para ello primero crearemos la siguiente clase:

>>> class Persona:
...     def __init__(self, edad):
...             self.edad = edad
... 
>>>
Anuncios

Esta es la clase mas basica de persona donde la edad que definimos no solo podra ser modificada por cualquiera sino que tampoco tendremos un rango de edad y podemos pasar cualquiera, nuestro siguiente paso sera crear una clase para implementar un getter and setter:

>>> class PersonaConAccesores:
...     def __init__(self, edad):
...             self._edad = edad
...     def get_edad(self):
...             return self._edad
...     def set_edad(self, edad):
...             if 18 <= edad <= 99:
...                     self._edad = edad
...             else:
...                     raise ValueError("La edad debe ser entre 18 y 99")
... 
>>>
Anuncios
Anuncios

En este caso volvemos a usar primero a __init__ para establecer el valor de edad pero en este caso tenemos un metodo llamado get_edad que usaremos para devolvernos el valor en edad, observen como tambien establecimos un nivel de seguridad en este, despues tenemos un metodo llamado set_edad donde verifica si edad es mayor o igual a 18 o menor o igual a 99, con esto establecemos un rango para nuestra edad, si el valor informado esta entre estos dos valores establece el valor en edad de lo contrario devuelve un error indicando que debemos informar una edad en ese rango, si bien con esto logramos un decorador y logramos el objetivo todavia no esta dentro de la filosofia de python, para ello vamos a usar el siguiente codigo:

>>> class PersonaPythonica:
...     def __init__(self, edad):
...             self._edad = edad
...     @property
...     def edad(self):
...             return self._edad
...     @edad.setter
...     def edad(self, edad):
...             if 18 <= edad <= 99:
...                     self._edad = edad
...             else:
...                     raise ValueError("La edad debe ser entre 18 y 99")
... 
>>>
Anuncios
Anuncios

Esta es similar a la anterior pero mas dentro de como lo es python, primero tenemos el __init__ para iniciar a edad, luego usamos a property, este le dira que usaremos un getter and setter, despues de esta palabra definimos un metodo llamado edad el cual se encarga de devolver el valor de edad, lo siguiente sera usar la expresion setter para establecer que sera la parte encargada de establecer el valor (set), agregamos el condicional que anteriormente explicamos, con estas dos acciones ya tenemos la posibilidad de recuperar y establecer un valor para edad, siempre y cuando este dentro del rango, y encima respetando la filosofia de python, vamos a probarlo para ver como funciona:

>>> persona = PersonaPythonica(44)
>>> print(persona.edad)
44
>>>
Anuncios

Creamos una persona por medio de la ultima clase y le establecemos un valor, si pedimos mostrarlo veremos que lo mostramos correctamente, pero probemos lo siguiente:

>>> persona.edad = 33
>>> print(persona.edad)
33
>>>
Anuncios

En este caso establecimos un nuevo valor pero directamente pasandolo a la variable y como vemos luego funciono correctamente al mostrarlo pero intentemos agregar un valor por fuera del rango que establecimos:

>>> persona.edad = 100
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 12, in edad
ValueError: La edad debe ser entre 18 y 99
>>>
Anuncios

Como podemos ver ahora si intentamos establecer un valor por fuera del rango nos devolvera un error pero tambien un aviso de cual es el valor a establecer, con esto podemos comprobar que logramos realmente lo que deseamos.

Anuncios

Para ir finalizando hablemos sobre los decoradores, como vimos en los ejemplos podemos usar tanto con el set y get delante de la funcion que deseamos pero tambien podemos establecer un property que le dira al programa que la siguiente funcion sera para obtener (getter) la informacion de la variable, luego por medio de otra arroba pero esta vez junto a setter establece que la funcion seguida de esta sera para establecer un nuevo valor en la variable, lo ideal es que tenga un nombre igual o que identifique correctamente con quien trabaja, tambien existe una opcion deleter y docs pero no las veremos en esta ocasion, por ultimo si quieren saber un poco mas sobre este tema les recomiendo visitar esta pagina:

Anuncios

https://www.geeksforgeeks.org/python-property-function/

Anuncios

En resumen, hoy hemos visto que es el decorador de propiedades, en este caso no es otra cosa que el getter and setter para python, hemos visto como poder usarlo como en todos los lenguajes pero tambien hemos visto como se puede trabajar con este en python a traves del @property, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50