Hola. No se si lo he entendido bien, pero puede que estes buscando algo asi: https://gist.github.com/niwibe/3654502 ? Obviamente esto solo es un experimento...
Andrey El 29 de agosto de 2013 08:24, Olemis Lang <ole...@gmail.com> escribió: > On 8/28/13, Chema Cortes <pych...@gmail.com> wrote: > > El día 28 de agosto de 2013 01:44, Olemis Lang <ole...@gmail.com> > escribió: > >> Busco una librería q implemente un mecanismo de extensión similar a > >> los traits (self, scala, smalltalk, ...) . Lo q necesito es extender > >> el comportamiento de clases sin herencia múltiple i.e. mixins . Si el > >> mecanismo funciona a nivel d objetos en vez d clases puede q m sirva > >> también . > >> > >> En mi corta investigación he encontrado : > >> > >> - https://pypi.python.org/pypi/strait : en la línea d lo q necesito > >> hacer > >> pero no permite redefinición (overrides) ni encadenamiento. > >> - http://pypi.python.org/pypi/Traits : > >> - https://pypi.python.org/pypi/simpletraits : lejanamente > >> parecido a lo q quiero hacer , creo q ni siquiera tiene q ver ... > >> > >> ¿Alguien conoce otra librería o alguna otra variante q pueda recomendar? > > > > Viendo estas referencias, hay quién confunde "traits" con la > > programación por contrato. Un trait define un comportamiento > > determinado mediante: > > > > - Métodos "concretos" que implementan un comportamiento determinado > > - Métodos "abstractos" que parametrizan un comportamiento determinado > > > > el vocabulario técnico parece ser más rico de lo q yo esperaba ... hay > un montón d cosas a las q le dicen traits sin relación alguna entre > ellas ; pero bueno, estaba hablando d algo como los traits d Scala ... > > [...] > > > > Supongo que ésto ya lo habías probado. > > ;) > > > Según pidés, no quieres > > "mixins", que equivaldría a que no quede rastro en el __mro__ . > > No es solamente por el hecho del mro , la cuestión consiste en q en el > modelo q necesitaría : > > 1. habría **muchas** clases parciales > 2. q extenderían / modificarían el comportamiento d una clase base > 3. pero la composición q se necesita en un caso determinado se > determina en tiempo d ejecución (o sea, se generan clases) > 4. y el número d clases en cada composición puede ser grande > > 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() > > > Se me > > ocurre complicar algo más Trait para que sea capaz de "inyectar" > > métodos: > > > > class Trait(ABCMeta): > > > > def __init__(self, name, bases, dic): > > self.__dic=dic > > > > def register(self, cls): > > super().register(cls) > > for k,v in self.__dic.items(): > > if not hasattr(cls,k): > > setattr(cls,k,v) > > return cls > > > > El modo de empleo de MyTrait sería como decorador: > > > > @MyTrait.register > > class MyClass(object): > > def __str__(self): > > return "MyTrait" > > > > assert(issubclass(MyClass, MyTrait)) > > assert(MyTrait not in MyClass.__mro__) > > > > c=MyClass() ##OK > > c.print() ## >>>MyTrait<<< > > > > El problema de este último sistema es que no tiene en cuenta los > > métodos abstractos ya que no está soportado añadir métodos abstractos > > dinámicamente. Como solución, se podría suplantar los métodos > > abstractos por una implementación que lanze una excepción > > "NotImplementedError" o similar. > > > > Algo parecido a esto es lo q busco pero con resolución dinámica d > nombres (i.e. sin copia) . D todas formas estaba tratando d evitar > tener q hacerlo. Pensé q era algo tan común q ya debería haber algo al > respecto , pero creo q no m va a quedar otro remedio q empezarlo desde > cero . > :'( > > [...] > > -- > 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: > Apache™ Bloodhound 0.7 listo para descarga - > http://goo.gl/fb/OwzmM > _______________________________________________ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > -- Andrey Antukh - Андрей Антух - <n...@niwi.be> http://www.niwi.be/about.html 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"
_______________________________________________ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/