implicaciones de usar property, setters y getters

Milton Galo Patricio Inostroza Aguilera minoztro en gmail.com
Mie Mayo 7 02:21:49 CEST 2008


El día 6 de mayo de 2008 12:50, Patricio Valarezo Lozano
<patovala en pupilabox.net.ec> escribió:
>
> 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?

este es muy bueno [1]

[1] http://www.cafepy.com/article/python_attributes_and_methods/python_attributes_and_methods.html


>
>  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
>



-- 
Milton Inostroza Aguilera
------------ próxima parte ------------
_______________________________________________
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