2011-01-03 11 views
7

tengo problema por el que yo quiero crear la función dinámica que hacer algún cálculo basado en los valores recuperados de la base de datos, estoy clara con mi cálculo interno, sino cuestión de cómo crear clase dinámica:Python: la creación de funciones dinámicas

mi estructura es algo como esto:

class xyz: 

    def Project(): 

     start = 2011-01-03 

     def Phase1(): 
      effort = '2d' 
     def Phase2(): 
      effort = '3d' 
     def Phase3(): 
      effort = '4d' 

Ahora queremos generar los PhaseX función de todo() de forma dinámica por lo que cualquiera puede sugerir cómo lograr tal cosa utilizando código de Python

Esperar ing para la respuesta positiva saludos Gracias

Respuesta

26

Con closures.

def makefunc(val): 
    def somephase(): 
    return '%dd' % (val,) 
    return somephase 

Phase2 = makefunc(2) 
Phase3 = makefunc(3) 

caveats

1

Esta respuesta puede estar asumiendo que sus intenciones son demasiado simplistas, pero parece como si desea establecer un valor para las llamadas a funciones particulares.

¿Consideraría algo como lo siguiente?

def setEffort(n): 
    effort = str(n)+'d' 
0

Usted puede utilizar la función de tipo para crear una clase Python dinámica o una metaclase. Enfermo describir el primer método:

myDynamicClassWithDynamicFunctions = type('ClassName', (object,), { 
    'phase1': aFunction, 
    'phase2': anotherFunction, 
    ....}) 

Los argumentos para el tipo son: el nombre de la clase, las bases de clase (como una tupla), la clase de atributos en un diccionario. Por supuesto, puede construir estos parámetros programáticamente como desee.

1

recientemente tuve problemas con este mismo tema, y ​​quería escribir lo que he encontrado para trabajar para mí ... usando el ejemplo originales. La diferencia con la respuesta anterior es que estoy usando setattr para hacer el nombre de la función (como parte de la clase) también.

class xyz(object): 
    def __init__(self): 
     # I wasn't clear how you were using effort...like this? 
     self.effort = '0d' 
    def add_phases(self, phase_dict): # Take a dictionary of phases and values 
     for phase, value in phase_dict.items(): 
      self.make_phase(phase, value) 
    def make_phase(self, phase, value): 
     def somephase(self): # Create a closure like @Ignacio 
      self.effort = str(value) + 'd' 
     setattr(self.__class__, "Phase" + str(phase), somephase) 

tracker = xyz() 
phases = {1:2, 2:1, 3:6, 4:2} 
tracker.add_phases(phases) 
tracker.Phase3() 
assert tracker.effort == '6d' 
Cuestiones relacionadas