implicaciones de usar property, setters y getters

Chema Cortes pych3m4 en gmail.com
Mar Mayo 6 02:51:02 CEST 2008


El día 5 de mayo de 2008 20:33, Patricio Valarezo Lozano
<patovala en pupilabox.net.ec> escribió:
> Hola, quisiera por favor que alguien me pudiera explicar la verdadera
> necesidad de usar property para definir getters y setters o para poder
> acceder a funciones privadas, me explico mejor:
>
>  Estoy revisando un código que usa Elixir(1) para definir un mapper a una
> base de datos, usa el siguiente código:
>
>
>  class Person(Entity):
>     id = Field(Integer, primary_key=True)
>     name = Field(String(50), required=True)
>     biography = Field(Text)
>     photo = Field(Binary, deferred=True)
>     _email = Field(String(20), colname='email', synonym='email')
>
>     def _set_email(self, email):
>        self._email = email
>     def _get_email(self):
>        return self._email
>     email = property(_get_email, _set_email)
>
>
>  Aquí ha declarado _email como privado (por el _ ) y luego define _set_email
> y _get_email para poder acceder a esta propiedad, luego define con property
> las propiedades y las asigna a email, ahora se podría acceder a _email
> mediante <objeto>.email, estoy en lo correcto?. Mi pregunta realmente es Por
> qué molestarse haciendo todo esto si a podría definir email = Field(...)
> como definió photo y los otros atributos??.

Yo diría que es equivalente, un ejemplo trivial donde mostrar cómo se
podrían especializar los accesores.

>  He leído en alguna parte que en Python lo de setters y getters no es muy
> bien visto (puesto que proviene de programadores acostumbrados al java y sus
> beans). tomando en cuenta que Python es un lenguaje que da al programador
> una gran libertad, quisiera que me dijeran cual es la ventaja real de usar
> _atributo y luego acceder con property? de que me estaría perdiendo si no lo
> hiciera así?

Bueno, lo de usar métodos accesores para acceder a los atributos de un
objeto es bastante más viejo que los javabeans (eg: visual basic 5).
En realidad es parte del paradigma de la programación orientada a
objetos, un modo de exponer datos encapsulados que se encontraban en
los interfaces privados o protegidos. El agruparlos en "propiedades"
(properties) es más por mejorar la legibilidad que por otra cosa, ya
que en python existían los "descriptores" que podían hacer esta misma
función (de hecho property() no es más que un data-descriptor
especializado).

El uso de accesores permite definir atributos de sólo lectura, de
"sólo una escritura" ("one-shot var") o con control de acceso. También
permiten crear "disparadores" ("triggers") para cuando cambia un
atributo, o "acopladores", para hacer encajar un interfaz en otro. Un
ejemplo de esto último sería cuando tienes una base de datos con datos
en unidades diferentes a las que usa la aplicación. Con los accesores
podrías hacer que las conversiones de unidades se hicieran de modo
transparente.

Otra razón, no menos importante, tiene que ver con la refactorización
del código. Si todo acceso se hace a través de accesores, es más fácil
luego llevar el atributo a otro sitio.


PD: seguramente Field() también sea un data-descriptor con métodos
__set__/__get__ .
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es