[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