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

Carlos Zuniga carlos.zun en gmail.com
Vie Oct 5 18:19:38 CEST 2012


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.


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