2012/2/12 Jose Caballero <jcaballero....@gmail.com>:
>
>
>> Efectivamente, como comenra Raúl, lo que nececitas implementas es el
>> patrón factory method. Para implemetarlo en python yo suelo hacer uso
>> de __new__: http://docs.python.org/reference/datamodel.html#object.__new__
>>
>>
>
>
> Hmm.
> No conocia __new__()
> He tenido que googlear un poco para saber de que va...
> Casi lo he conseguido. Si hago esto,
>
>
> --------------------------------------------------------------
> class fac(object):
>         def __new__(cls, x):
>                 if x == 0:
>                         return A()
>                 else:
>                         return B()
>
> class A(object):
>         def __init__(self):
>                 print '__init__ en A'
>         def f(self):
>                 print 'f en A'
>
> class B(object):
>         def __init__(self):
>                 print '__init__ en B'
>         def f(self):
>                 print 'f en B'
>
> class MyClass(fac):
>         pass
>
>
> o = MyClass(0)
> o.f()
> --------------------------------------------------------------
>
> obtengo lo siguiente
>
> __init__ en A
> f en A
>
> Perfecto.
> Sin embargo, si intento esto:
>
> --------------------------------------------------------------
> class fac(object):
>         def __new__(cls, x):
>                 if x == 0:
>                         return A()
>                 else:
>                         return B()
>
> class A(object):
>         def __init__(self):
>                 print '__init__ en A'
>         def f(self):
>                 print 'f en A'
>
> class B(object):
>         def __init__(self):
>                 print '__init__ en B'
>         def f(self):
>                 print 'f en B'
>
> class MyClass(fac):
>         def __init__(self):
>                 print '__init__ en MyClass'
>
>
> o = MyClass(0)
> o.f()
> --------------------------------------------------------------
>
> No parece que __init__() en MyClass sea invocado.
> Alguien me puede dar una pista?

Una pista? ;-)
Prueba hacer esto:

    o = MyClass(0)
    print o.__class__.__name__

¿Que te devuelve y por qué?

De todas maneras, en tu caso no te sirve subclasear el factory,
simplemente usa `o = fac(0)`. Tal vez si explicas mejor que es lo que
intentas hacer? No entiendo el caso de uso para eso. Tal vez intentas
hacer alguna especie de interfaz? No podrías usar un wrapper?:

    class MyClass():
        def __init__(self, x):
            if x == 0:
                self.object = A()
            else:
                self.object = B()

        def f(self):
            self.object.f()


Saludos
-- 
Linux Registered User # 386081
A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos
de leer manuales.
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a