[Python-es] Derivacion condicional

Oswaldo Hernández listas en soft-com.es
Jue Jul 12 17:22:12 CEST 2007


Chema Cortes escribió:
> El 12/07/07, Oswaldo Hernández <listas en soft-com.es> escribió:
> 
>> El problema es cuando la decision se ha de realizar en la propia 
>> creación de la clase al evaluar los
>> parametros.
> 
> Para ésto lo mejor sería usar metaclases. Pero...
> 
> 
>> Esto funciona, pero lo que no consiguo es hacer una clase que haga la 
>> derivacion de a o b de forma
>> automatica:
>>
>> class C(SelectClase(parametro)):
>>         pass
>>
>> aqui da error, puesto que 'parametro' no esta definido.
> 
> Aquí me he perdido. Sintácticamente está correcto, y el que no
> encuentre el parámetro depende de la manera de pasarlo. ¿En qué
> momento se realiza la decisión?
> 
> Intuyo que hay un problema de concepto: las clases se "crean" cuando
> se definen, no cuando instancian. Si quieres que el tipo de cada
> instancia se decida justo en el momento de su instanciación tendrás
> emplear algún patrón "Factoría"; posiblemente, trasteando con el
> método __new__ te resulte suficiente:
> 
> 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.

Me parece que voy a releer el tema de las metaclases y del operador new.

Gracias.
-- 
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************



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