[Python-es] Derivacion condicional
Oswaldo Hernández
listas en soft-com.es
Jue Jul 12 14:27:40 CEST 2007
Chema Cortes escribió:
> El 11/07/07, Oswaldo Hernández <listas en soft-com.es> escribió:
>
>> Me interesaria saber si es posible que una clase decida por si misma
>> de que clase tiene que derivar.
>> Es decir, tengo 2 clases 'patron' que tienen un interface similar,
>> pero no son exactamente iguales.
>>
>> class a:
>> ....
>>
>> class b:
>> ....
>>
>> Ahora quiero crear una tercera clase que, en en funcion de unas
>> condiciones (variable global,
>> parametro, etc) decida si misma si deriva de la clase 'a' o de la
>> clase 'b'.
>>
>> # variable global
>> usar_a = True
>>
>> class c( ????? ):
>> def __init__()
>> if usar_a:
>> ???????
>>
>> He estado mirando las metaclases, pero no se si serian la solución
>> para esto, ademas que no termino
>> de enterderlas :(
>
> Es más sencillo que éso:
>
>
> X = A if usar_a else B
>
> class C(X):
> ...
Esta solucion la habia pensado para los casos en los que la seleccion dependiera de una variable
global, incluso establecer los valores mediente una funcion para hacerlo de forma dinamica (despues
de haber realizado el import).
El problema es cuando la decision se ha de realizar en la propia creación de la clase al evaluar los
parametros.
Lo unico que he conseguido es hacer una funcion que evalue los parametros y retorne la clase
apropiada, pero no me permite derivar esta a su vez, ademas de que no veo la solucion muy 'elegante'
class a:
def __init__(self, p1):
print "iniciar a, valores: %s" % p1
self.p1 = p1
def p(self):
print "p1 en a:", self.p1 / 2
class b:
def __init__(self, p1):
print "iniciar b, valores: %s" % p1
self.p1 = p1
def p(self):
print "p1 en b:", self.p1 * 2
# funcion auxiliar para selecciona de clase dinamicamente segun los parametros
def SelectClase(p1):
if p1 < 100:
return a
else:
return b
# Creacion de instancias utilizando la funcion
parametro = 1
inst = SelectClase(parametro)(parametro)
inst.p()
parametro = 200
inst = SelectClase(parametro)(parametro)
inst.p()
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.
Alguna idea?
Gracias.
--
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
Más información sobre la lista de distribución Python-es