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