[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