[Python-es] encapsular llamadas a metodos arbitrarios desde una clase container

G V nadaird en gmail.com
Vie Oct 5 19:07:34 CEST 2012


si no te molesta tocar un poco de programación funcional, lambdas y demas:

a = ['hola', 'adios']
map(lambda x:x.swapcase(), a)

esto da un resultado de:
['HOLA', 'ADIOS']

espero que te sirva para orientar lo que quieres hacer ;)

2012/10/5 Carlos Zuniga <carlos.zun en gmail.com>:
> 2012/10/5 Jose Caballero <jcaballero.hep en gmail.com>:
>> Hola,
>>
>>
>>
>> pido disculpas por adelantado por lo criptico del "subject". Intentare
>> explicar mejor lo que quiero hacer.
>> Quiero crear una clase Container que contiene una lista de objetos de una
>> clase X arbitraria.
>>
>>
>> ------------------------------------------------------------------------------
>> class Container:
>>     def __init__(self, list_obj):
>>         self.list_obj = list_obj
>>
>> class X:
>>     blah
>>
>> x1 = X()
>> x2 = X()
>> x3 = X()
>>
>> container = Container( [ x1, x2, x3] )
>> ------------------------------------------------------------------------------
>>
>>
>> Me gustaria poder llamar a un metodo cualquiera en Container, y que
>> internamente haga un loop de llamadas a ese mismo metodo para todos los
>> objectos de la lista.
>> Por ejemplo, si hago
>>
>> container.f()
>>
>> que internamente se haga un loop de llamadas:
>>
>> x1.f()
>> x2.f()
>> x3.f()
>>
>>
>> Lo mas cerca que estoy de conseguirlo es con lo siguiente:
>>
>>
>> ------------------------------------------------------------------------------
>> class Container:
>>        ...
>>        ...
>>        def __getattr__(self, atr):
>>                     outs = []
>>                     for o in self.list_obj:
>>                             out = getattr(o, atr)()
>>                             outs.append(out)
>>                     return outs
>> ------------------------------------------------------------------------------
>>
>>
>> con ese codigo puedo hacer
>>
>> container.f
>> container.g
>> container.h
>>
>> pero no
>>
>> container.f()
>> container.g()
>> container.h()
>>
>>
>> Sigo investigando, pero si mientras tanto alguien me ofrece una pista, sera
>> mas que bienvenida.
>
> Tal vez algo como:
>
>     class Cont:
>         ...
>         def __getattr__(self, atr):
>             def foo():
>                 outs = []
>                 for o in self.list_obj:
>                     out = getattr(o, atr)()
>                     outs.append(out)
>                 return outs
>            return foo
>
>
>>
>> Saludos cordiales,
>> Jose
>> P.S. perdon por la ausencia de tildes.
>
> UTF existe, ya no es excusa ;-)
>
> Saludos
> --
> A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos
> de leer manuales.
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/


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