[Python-es] Traits en Python

Chema Cortes pych3m4 en gmail.com
Jue Ago 29 19:44:45 CEST 2013


El día 29 de agosto de 2013 17:12, Olemis Lang <olemis en gmail.com> escribió:
> On 8/29/13, Chema Cortes <pych3m4 en gmail.com> wrote:
>> El día 29 de agosto de 2013 08:24, Olemis Lang <olemis en gmail.com> escribió:
> [...]
>>> razón por la cual estaba creyendo conveniente tener el equivalente d
>>> (Scala)
>>>
>>> new Class() with Trait1 with Trait2 with ... Trait_n{
>>>   def transform(obj: String): obj.toLower()
>>> }
>>>
>>> con una sintaxis más o menos así
>>>
>>> cls = Trait1(Trait2(... Trait_n(Class)))
>>> obj = cls()
>>
>> No entiendo bien. La versión "decorador" que te había puesto puede
>> hacer este "encadenado":
>>
>> cls = Trait1.register(Trait2.register(....Trait_n.register(Class)))
>>
>> Si lo quieres más práctico, cambia el método register por un método
>> __call__
>>
>
> sí , lo q trataba d decir q el ejemplo está bastanate bien , solo q le
> faltaría un detalle para no copiar los atributos del trait en el
> namespace de la definición local de la clase , sino resolverlos
> dinámicamente à la MRO.
> ;)

Entiendo. Para lo que necesitas tendrías que hackear el método
__getattribute__ responsable del funcionamiento de los descriptores.
Sobrecargando este método en type.__getattribute__ (por ejemplo, desde
una metaclase) podrías añadir a la cadena de búsqueda de atributos el
conjunto de traits que quieres añadir.

La mala noticia es que las optimizaciones del intérprete de python
ignoran el método __getattribute__ cuando se trata de métodos
especiales (eg: __str__, __len__, __hash__,...), que son,
precisamente, los más interesantes para definir comportamientos.

La única forma que veo que funcione correctamente algo así es copiando
los métodos en la clase.

>
>> Otra cosa distinta es que quieras crear clases anónimas como en scala.
>> Pero, según Guido, éso es sólo para listos. :-P
>>
>
> <joke> ¡ uso Python ! soy muy listo :P </joke>
>
> [...]
>
> --
> Regards,
>
> Olemis - @olemislc
>
> Apache™ Bloodhound contributor
> http://issues.apache.org/bloodhound
> http://blood-hound.net
>
> Blog ES: http://simelo-es.blogspot.com/
> Blog EN: http://simelo-en.blogspot.com/
>
> Featured article:
> Google Zoo - http://goo.gl/fb/rEI8e
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/



-- 
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
http://ch3m4.org/blog
Buscador Python Hispano: http://ch3m4.org/python-es


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