[python-madrid] Problema con __getattr__
Vicente Ruiz
vruiz2.0 at gmail.com
Thu Apr 12 13:09:25 CEST 2012
Según tengo yo entendido, antes de la versión 2.1 o 2.2, se diferenciaban
"tipos" y "clases" y la construcción de éstas era distinta. En esa versión
de Python aparece el new-style que trata de unificar esto, por eso ahora
todo hereda de object (si es new-style, claro). Por compatibilidad se ha
mantenido el old-style, pero este desaparece completamente en Python 3.
Un ejemplo de old-style:
class MiNuevoTipo:
...
class UnaClaseDe(MiNuevoTipo):
...
las diferencias técnicas, ya no las conozco, yo me crié con el new-style :)
Un saludo,
Vicente Ruiz
El 12 de abril de 2012 12:50, Andrey Antoukh <andsux at gmail.com> escribió:
> A grandes rasgos, lo que hacen es añadir mas metodos. Es lo mas
> perceptible. Por otro lado nos encontramos que el comportamiento de la
> clase cambia, sobretodo cuando juegas con metaclases.
>
> No soy un experto en ello pero recomiendo leer:
> http://www.python.org/doc/newstyle/
>
> Andrei.
>
> El 12 de abril de 2012 12:45, piranna at gmail.com <piranna at gmail.com>escribió:
>
> Alguien me puede explicar las diferencias entre old-classes y new-classes?
>> Porque aparte de que las nuevas tienen mas metodos no veo ninguna... :-(
>>
>> Sent from my Android cell phone, please forgive the lack of format on the
>> text, and my fat thumbs :-P
>> El 12/04/2012 10:31, "Andrey Antoukh" <andsux at gmail.com> escribió:
>>
>> Solución a eso: no uses twisted \o/ ( ahí solté mi primer troll del día )
>>>
>>> El 12 de abril de 2012 10:26, Manuel de la Peña <etil15 at gmail.com>escribió:
>>>
>>>>
>>>> On Apr 12, 2012 10:17 AM, "Vicente Ruiz" <vruiz2.0 at gmail.com> wrote:
>>>> >
>>>> > Yo seguía con el ejemplo de Miguel Angel en la cabeza :D
>>>> >
>>>>
>>>> Es que yo como Andrei, nada de old class, menos en twisted :(
>>>>
>>>> > El 12 de abril de 2012 10:10, Manuel de la Peña <etil15 at gmail.com>
>>>> escribió:
>>>> >
>>>> >> Estaba asumiendo que se extendida de object como mínimo :)
>>>> >>
>>>> >> On Apr 12, 2012 9:30 AM, "Vicente Ruiz" <vruiz2.0 at gmail.com> wrote:
>>>> >>>
>>>> >>> Coincido con Andrei :)
>>>> >>>
>>>> >>> En cuanto a lo que comentas, Manuel, no puedes llamar al padre
>>>> usando old-style, la que estarías mezclando objetos y tipos. Para mantener
>>>> la interfaz de getattr funciona así:
>>>> >>>
>>>> >>> class EasyDict:
>>>> >>> def __init__(self):
>>>> >>> self._values = {}
>>>> >>>
>>>> >>> def add(self, k, v):
>>>> >>> self._values[k] = v
>>>> >>>
>>>> >>> def __getattr__(self, name):
>>>> >>> if name in self._values:
>>>> >>> return self._values[name]
>>>> >>> raise AttributeError
>>>> >>>
>>>> >>> def __str__(self):
>>>> >>> return str(self._values)
>>>> >>>
>>>> >>> y creo que te referías a este otro cuando hablas de llamar al padre:
>>>> >>>
>>>> >>> class EasyDict(dict):
>>>> >>> def add(self, k, v):
>>>> >>> self[k] = v
>>>> >>>
>>>> >>> def __getattr__(self, name):
>>>> >>> try:
>>>> >>> return super(EasyDict, self).__geattr__(name)
>>>> >>> except AttributeError:
>>>> >>> if name in self:
>>>> >>> return self[name]
>>>> >>> raise AttributeError
>>>> >>>
>>>> >>> al estar extendiendo un diccionario propiamente dicho, aquí si
>>>> puedes hacer la llamada al padre.
>>>> >>>
>>>> >>> Un saludo,
>>>> >>> Vicente Ruiz
>>>> >>>
>>>> >>> El 12 de abril de 2012 09:23, Andrey Antoukh <andsux at gmail.com>
>>>> escribió:
>>>> >>>>
>>>> >>>> Usar oldclass hoy en día debe ser un crimen penal! xD
>>>> >>>>
>>>> >>>> Andrei. ;)
>>>> >>>>
>>>> >>>> El 12 de abril de 2012 09:13, Manuel de la Peña <etil15 at gmail.com>
>>>> escribió:
>>>> >>>>
>>>> >>>>>
>>>> >>>>> On Apr 12, 2012 8:54 AM, "Vicente Ruiz" <vruiz2.0 at gmail.com>
>>>> wrote:
>>>> >>>>> >
>>>> >>>>> > Hola Miguel Ángel,
>>>> >>>>> >
>>>> >>>>> > es una pregunta muy buena :) La verdad es que me ha costado un
>>>> rato dar con el problema. Prueba cambiar esto:
>>>> >>>>> >
>>>> >>>>> > class EasyDict: --> class EasyDict(object):
>>>> >>>>> >
>>>> >>>>> > Esto se debe a que en las versiones anteriores a Python 3.x
>>>> existen 2 tipos de clases: new-style y old-style. Esto desaparece en Python
>>>> 3, siendo todas new-style. Puedes leer más sobre el tema aquí:
>>>> http://docs.python.org/reference/datamodel.html#new-style-and-classic-classes
>>>> >>>>> >
>>>> >>>>> > Un saludo,
>>>> >>>>> > Vicente Ruiz
>>>> >>>>>
>>>> >>>>> Buenas,
>>>> >>>>>
>>>> >>>>> Acá van mis 2c, la implementación no es totalmente correcta ya
>>>> que tiene los siguientes fallos:
>>>> >>>>>
>>>> >>>>> 1. Estas devolviendo None cuando el valor no está en el dict.
>>>> Esto rompe la interfaz de getattr, lo correcto sería lanzar la excepción
>>>> AtributeError.
>>>> >>>>> 2. No estas llamando al getattr del parental class cosa que es
>>>> probablemente recomendable, yo haría algo como:
>>>> >>>>>
>>>> >>>>> def __getattr__(self, name):
>>>> >>>>> try:
>>>> >>>>> return super(Easydict, self).__geattr__(name)
>>>> >>>>> except AttributeError:
>>>> >>>>> if name in self.dict:
>>>> >>>>> return self.dict [name]
>>>> >>>>> raise AttributeError
>>>> >>>>>
>>>> >>>>> Creo recordar que si era un new class puedes usar super de está
>>>> forma, pero no lo he probado por que estoy en el metro : P.
>>>> >>>>>
>>>> >>>>> Saludos
>>>> >>>>>
>>>> >>>>>
>>>> >>>>> >
>>>> >>>>> > El 12 de abril de 2012 08:25, Kiko <kikocorreoso at gmail.com>
>>>> escribió:
>>>> >>>>> >
>>>> >>>>> >>
>>>> >>>>> >>
>>>> >>>>> >> El 12 de abril de 2012 07:58, Miguel Angel <
>>>> miguelangel.garcia at gmail.com> escribió:
>>>> >>>>> >>
>>>> >>>>> >>> Hola!
>>>> >>>>> >>>
>>>> >>>>> >>> Tengo un problema y no sabía muy bien dónde preguntar... No
>>>> sé si esta lista se utiliza sólo para las reuniones o las preguntas también
>>>> tienen cabida.
>>>> >>>>> >>
>>>> >>>>> >>
>>>> >>>>> >> A priori no hay ningún problema con las preguntas pero la
>>>> finalidad de esta lista es un poco de organización de python-madrid, las
>>>> quedadas y cosas así.
>>>> >>>>> >>
>>>> >>>>> >> Seguro que muchos de esta lista te podrán responder pero para
>>>> el futuro es más adecuado que para las dudas técnicas de python acudas a:
>>>> >>>>> >>
>>>> >>>>> >> -la lista python-es (
>>>> http://mail.python.org/mailman/listinfo/python-es).
>>>> >>>>> >> -a python.majibu (http://python.majibu.org/)
>>>> >>>>> >>
>>>> >>>>> >> Donde hay mucha más gente que en esta lista y cuyo objetivo es
>>>> ese, resolver dudas técnicas
>>>> >>>>> >>
>>>> >>>>> >> Saludos.
>>>> >>>>> >>
>>>> >>>>> >> --
>>>> >>>>> >> Grupo de usuarios de python ubicados en Madrid
>>>> >>>>> >> http://groups.google.es/group/python-madrid
>>>> >>>>> >> http://python-madrid.es
>>>> >>>>> >> http://twitter.com/#!/python_madrid
>>>> >>>>> >> Para darte de baja del grupo envía un mensaje a
>>>> python-madrid+unsubscribe at googlegroups.com
>>>> >>>>> >
>>>> >>>>> >
>>>> >>>>> >
>>>> >>>>> >
>>>> >>>>> > --
>>>> >>>>> > Disponible en:
>>>> >>>>> >
>>>> >>>>> > http://www.vicenteruiz.es/
>>>> >>>>> > http://www.menudoproblema.es/
>>>> >>>>> > Twitter - LinkedIn
>>>> >>>>> >
>>>> >>>>> > --
>>>> >>>>> > Grupo de usuarios de python ubicados en Madrid
>>>> >>>>> > http://groups.google.es/group/python-madrid
>>>> >>>>> > http://python-madrid.es
>>>> >>>>> > http://twitter.com/#!/python_madrid
>>>> >>>>> > Para darte de baja del grupo envía un mensaje a
>>>> python-madrid+unsubscribe at googlegroups.com
>>>> >>>>>
>>>> >>>>> --
>>>> >>>>> Grupo de usuarios de python ubicados en Madrid
>>>> >>>>> http://groups.google.es/group/python-madrid
>>>> >>>>> http://python-madrid.es
>>>> >>>>> http://twitter.com/#!/python_madrid
>>>> >>>>> Para darte de baja del grupo envía un mensaje a
>>>> python-madrid+unsubscribe at googlegroups.com
>>>> >>>>
>>>> >>>>
>>>> >>>>
>>>> >>>>
>>>> >>>> --
>>>> >>>> Andrei Antoukh - <niwi at niwi.be>
>>>> >>>> http://www.niwi.be/page/about/
>>>> >>>> http://www.kaleidos.net/A5694F/
>>>> >>>>
>>>> >>>> "Linux is for people who hate Windows, BSD is for people who love
>>>> UNIX"
>>>> >>>> "Social Engineer -> Because there is no patch for human stupidity"
>>>> >>>>
>>>> >>>> --
>>>> >>>> Grupo de usuarios de python ubicados en Madrid
>>>> >>>> http://groups.google.es/group/python-madrid
>>>> >>>> http://python-madrid.es
>>>> >>>> http://twitter.com/#!/python_madrid
>>>> >>>> Para darte de baja del grupo envía un mensaje a
>>>> python-madrid+unsubscribe at googlegroups.com
>>>> >>>
>>>> >>>
>>>> >>>
>>>> >>>
>>>> >>> --
>>>> >>> Disponible en:
>>>> >>>
>>>> >>> http://www.vicenteruiz.es/
>>>> >>> http://www.menudoproblema.es/
>>>> >>> Twitter - LinkedIn
>>>> >>>
>>>> >>> --
>>>> >>> Grupo de usuarios de python ubicados en Madrid
>>>> >>> http://groups.google.es/group/python-madrid
>>>> >>> http://python-madrid.es
>>>> >>> http://twitter.com/#!/python_madrid
>>>> >>> Para darte de baja del grupo envía un mensaje a
>>>> python-madrid+unsubscribe at googlegroups.com
>>>> >>
>>>> >> --
>>>> >> Grupo de usuarios de python ubicados en Madrid
>>>> >> http://groups.google.es/group/python-madrid
>>>> >> http://python-madrid.es
>>>> >> http://twitter.com/#!/python_madrid
>>>> >> Para darte de baja del grupo envía un mensaje a
>>>> python-madrid+unsubscribe at googlegroups.com
>>>> >
>>>> >
>>>> >
>>>> >
>>>> > --
>>>> > Disponible en:
>>>> >
>>>> > http://www.vicenteruiz.es/
>>>> > http://www.menudoproblema.es/
>>>> > Twitter - LinkedIn
>>>> >
>>>> > --
>>>> > Grupo de usuarios de python ubicados en Madrid
>>>> > http://groups.google.es/group/python-madrid
>>>> > http://python-madrid.es
>>>> > http://twitter.com/#!/python_madrid
>>>> > Para darte de baja del grupo envía un mensaje a
>>>> python-madrid+unsubscribe at googlegroups.com
>>>>
>>>> --
>>>> Grupo de usuarios de python ubicados en Madrid
>>>> http://groups.google.es/group/python-madrid
>>>> http://python-madrid.es
>>>> http://twitter.com/#!/python_madrid
>>>> Para darte de baja del grupo envía un mensaje a
>>>> python-madrid+unsubscribe at googlegroups.com
>>>>
>>>
>>>
>>>
>>> --
>>> Andrei Antoukh - <niwi at niwi.be>
>>> http://www.niwi.be/page/about/
>>> http://www.kaleidos.net/A5694F/
>>>
>>> "Linux is for people who hate Windows, BSD is for people who love UNIX"
>>> "Social Engineer -> Because there is no patch for human stupidity"
>>>
>>> --
>>> Grupo de usuarios de python ubicados en Madrid
>>> http://groups.google.es/group/python-madrid
>>> http://python-madrid.es
>>> http://twitter.com/#!/python_madrid
>>> Para darte de baja del grupo envía un mensaje a
>>> python-madrid+unsubscribe at googlegroups.com
>>>
>> --
>> Grupo de usuarios de python ubicados en Madrid
>> http://groups.google.es/group/python-madrid
>> http://python-madrid.es
>> http://twitter.com/#!/python_madrid
>> Para darte de baja del grupo envía un mensaje a
>> python-madrid+unsubscribe at googlegroups.com
>>
>
>
>
> --
> Andrei Antoukh - <niwi at niwi.be>
> http://www.niwi.be/page/about/
> http://www.kaleidos.net/A5694F/
>
> "Linux is for people who hate Windows, BSD is for people who love UNIX"
> "Social Engineer -> Because there is no patch for human stupidity"
>
> --
> Grupo de usuarios de python ubicados en Madrid
> http://groups.google.es/group/python-madrid
> http://python-madrid.es
> http://twitter.com/#!/python_madrid
> Para darte de baja del grupo envía un mensaje a
> python-madrid+unsubscribe at googlegroups.com
>
--
*Disponible en:*
http://www.vicenteruiz.es/
http://www.menudoproblema.es/ <http://es.linkedin.com/in/alvarohurtado>
Twitter <http://twitter.com/menudoproblema> -
LinkedIn<http://es.linkedin.com/in/vicenteruiz>
--
Grupo de usuarios de python ubicados en Madrid
http://groups.google.es/group/python-madrid
http://python-madrid.es
http://twitter.com/#!/python_madrid
Para darte de baja del grupo envía un mensaje a python-madrid+unsubscribe at googlegroups.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.es.python.org/pipermail/madrid/attachments/20120412/772112f4/attachment.html>
More information about the Madrid
mailing list