Derivacion condicional
Chema Cortes
pych3m4 en gmail.com
Jue Jul 12 19:14:59 CEST 2007
El 12/07/07, Oswaldo Hernández <listas en soft-com.es> escribió:
> Chema Cortes escribió:
> > class C(object):
> > def __new__(cls,sel,*args,**kw):
> > if sel<100:
> > return A(*args,**kw)
> > else:
> > return B(*args,**kw)
> >
> > assert isinstance(C(1),A)
> > assert isinstance(C(111),B)
>
> El problema de esto es que:
>
> isinstance(C(1), C) -> False
> Tambien si C tiene un metodo __init__ (o cualquier otro) este no se ejecuta puesto que __new__ no
> devuelve una clase tipo C.
Supongo que lo debes tener claro; pero es dificil saber qué es lo que
buscas sin ver el grafo de herencias que tienes previsto. Por la
respuesta que has dado a Gerardo sospecho que las metaclases tampoco
te van a servir.
Basándome en la respuesta de Gerardo, asumo que A y B derivan de
clases diferentes, y que el objetivo es "unificar" interfaces, una de
la técnicas más simples que te pueden servir es la "delegación":
class C:
def __init__(self,sel):
self._instance=A() if sel<100 else B()
def __getattr__(self,name):
return getattr(self._instance,name)
La clase C no deriva ni de A ni de B, pero al menos "actúa" como si lo fuera.
Más información sobre la lista de distribución Python-es