[Python-es] decidir en "real time" de qué clase heredar

Txema Vicente txema en nabla.net
Mar Feb 14 22:27:10 CET 2012


> donde me gustaria que MyClass pudiese decidir si quiere heredar de 
> Base1 o de Base2... si es que eso es posible.
> Las primeras respuestas que recibi parecian indicar que con una 
> Factory era trivial, pero la verdad es que no he sido capaz  
> :)faq.wikidot.com/ 

Por curiosidad lo he intentado. No se si es muy recomendable hacer esto, 
pero parece que funciona:


class Base1(object):
     def __init__(self):
         print "Base1.init"

class Base2(object):
     def __init__(self):
         print "Base2.init"

class MyClass(object):
     def __new__(cls, x):
         base = None
         if x==1: base = Base1
         elif x==2: base = Base2
         if base is None: return object.__new__(cls)

         clase = type('MyClass', (MyClass, base, object), {})
         return super(MyClass, clase).__new__(clase)

     def __init__(self, x):
         self.x = x
         print "Myclass.init"
         super(MyClass, self).__init__()

for x in range(0,3):
     a = MyClass(x)
     print str(x), str(a), a.__class__.__bases__

SALIDA:
 >>>
Myclass.init
0 <__main__.MyClass object at 0x040FB6B0> (<type 'object'>,)

Myclass.init
Base1.init
1 <__main__.MyClass object at 0x040FBAF0> (<class '__main__.MyClass'>, 
<class '__main__.Base1'>, <type 'object'>)

Myclass.init
Base2.init
2 <__main__.MyClass object at 0x041001D0> (<class '__main__.MyClass'>, 
<class '__main__.Base2'>, <type 'object'>)


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