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/