implicaciones de usar property, setters y getters
Patricio Valarezo Lozano
patovala en pupilabox.net.ec
Mar Mayo 6 18:50:48 CEST 2008
Chema Cortes wrote:
> 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
>
Muchas gracias por tu aporte, me podrías sugerir algun articulo que
aclare un poco mas lo de descriptores en python?
gracias
PV
--
patoVala
Linux User#280504
Hablando en http://www.elprimoalcahuete.com
"Someone whom you reject today, will reject you tomorrow."
_______________________________________________
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