Propiedades en Python (@property) – Getter, Setter, Deleter – OOP

Las propiedades privadas y ocultas

Buenas! Hoy vamos a ver las propiedades en python y para que nos serán útiles!. Pero antes me gustaría hablar un poco de las propiedades privadas y aclarar algunas cosillas respecto a ellas. Algo con lo que me he estado comiendo el coco últimamente.Malditas propiedades ocultas

Se dice que si anteponemos el underscore («_», «__») a una variable, método, etc. Definimos si son del tipo privadas y ocultas. Y yo lo tome personal, hasta que me enrede.. Entonces dije, a tomar por culo con las propiedades ocultas ni que ochocuartos. Si se podía acceder a una variable aunque fuera «oculta», o «privada» entonces no entendía para que tanto embrollo..

Resulta que en Python a diferencia de otros lenguajes no existen las propiedades ocultas o privadas para ocultar al usuario determinados datos como se cree. A lo largo de estos días me lo he pasado recorriendo la red como si fuera una araña de google tratando de entender esto por qué existe una confusión sobre los métodos que utilizan el underscore (_ y __) y cual es la razón de existencia de los mismos.

Finalmente di con este articulo donde se explica correctamente el uso de atributos, variables, propiedades privadas y para que sirven realmente. Te recomiendo leerlo: Cazadores de mitos: Las propiedades ocultas en Python

Las propiedades o métodos privados son en realidad para uso interno.

A veces es necesario utilizar variables o métodos auxiliares para cumplir con el objetivo de la clase. Estos, no son necesarios exponerlos fuera de la clase. En base a esto es que los lenguajes orientados a objetos tienen mecanismos para ocultarlos.Usa la fuerza del conocimiento!

Ojo

Pero cuando usamos clases, se aconseja que los atributos sean ocultos, de manera que únicamente, a través de los métodos Getter, setter, deleter, se pueda acceder o modificar sus valores. Por ende, modifica tu forma de programar de ahora en mas y utiliza estos conocimientos!

 

 

Para ocultar métodos, variables basta con anteponer los underscores antes de la variable, método u atributo al que se quiere aplicar esta propiedad. Ejemplo:

Resultado:

Nombre: Martín
Oculta: Un revolver
Nombre: Martín
Oculta: Un revolver

Recordamos y demostramos que aun así son accesibles.. Pero su uso es útil para evitar colisiones de nombres o romper procesos internos cuando los métodos de subclases se denominan igual que los de la clase padre, etc.

Hehe que no estas aquí cifrando ni escondiendo nada!

Propiedades de atributos de clase en Python: Getter, Setter y Deleter

Siguiendo con las propiedades en python tratemos de entenderlo rápidamente.

Atención

En python dentro de las clases podríamos decir que todo son atributos, incluso los métodos podríamos definirlos como «atributos llamables» y las propiedades «atributos personalizables». Por ende ahora:

Las propiedades son atributos que «manejamos» mediante Getter, Setter y Deleter.

«Atributos manejables» que nos permiten invocar código personalizado al ser creados, modificados o eliminados.

Las propiedades nos permiten por ejemplo llamar código personalizado cuando un atributo, método, variable es mostrado/a, modificado/a, borrado/a.

O otro caso de ejemplo seria, automatizar la modificación de una variable «B» cuando se modifique «A» o guardar un historial de modificación de un atributo, entre otros muchos usos..

¿Habéis entendido alguna palabra o solo lié todo?

Pues tranquilo sigue leyendo que aquí es de donde sales entendiendo todo o sino cierro este blog y a otra cosa mariposa.. Si no lo entiendes aquí, yo habré fracasado!!

@Property en python

La función integrada property() nos permitirá interceptar la escritura, lectura, borrado de los atributos y ademas nos permiten incorporar una documentación sobre los mismos. La sintaxis para invocarla es la siguiente:

Si, es un decorador.

Si nosotros no pasamos alguno de los parámetros su valor por defecto sera None.

Getter: Se encargará de interceptar la lectura del atributo. (get = obtener)

Setter : Se encarga de interceptar cuando se escriba. (set = definir o escribir)

Deleter : Se encarga de interceptar cuando es borrado. (delete = borrar)

doc :  Recibirá una cadena para documentar el atributo. (doc = documentación)

Ahora te explico esto con un código sencillo y fácil de entender..:

Resultado:

Tom
Modificando nombre..
El nombre se ha modificado por
Tomasito

Borrando nombre..

 

Se define primero property y luego de ella el método mediante el cual retornamos el nombre (get) que en este caso al ser el primer método luego de property lo toma automáticamente como Getter (linea 10). Luego especificamos el (set) que nos permite lanzar un print al modificar el atributo privado nombre. Y luego el (deleter) que nos permite lanzar otro print al borrarlo.

Y eso es todo, sencillo y sin mas vueltas.

En este ejemplo anterior las propiedades no aplican al atributo peso. Cuando llamemos, modifiquemos o eliminemos el atributo privado oculto «__nombre» se aplicaran dichas modificaciones según la acción que se realiza con el. ¿Me explico?. Las propiedades te permiten variar el resultado según la acción que se realiza con el atributo, si lo modificas sucede algo. Pero si lo borras sucede otra cosa.

 

Recordamos que luego de property debes especificar el nombre del método seguido del punto y la propiedad de la que se trate(setter, getter, deleter).

Ahora vamos a agregar el peso, permitirnos modificarlo u borrarlo. En ese caso no podemos colocarlo dentro del mismo, se debe crear otro decorador para dicho método.

Resultado

Tom
Modificando nombre..
El nombre se ha modificado por
Tomasito
El peso ahora es
28
Borrando nombre..

 

 

Descansando en la nube: login offEn la siguiente entrada vamos a ver algunos ejemplos mas prácticos del uso de clases completo. Por ahora solo te dejo este ejemplo sencillo para que comprendas el funcionamiento de las propiedades en python 3. Y comiences a aplicarlo a partir de ahora. Hasta la vista!!

 

 

 

Ayúdame a llegar a mas personas!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •