2011-01-03 3 views
7

У меня есть проблема, когда я хочу создать динамическую функцию, которая будет делать некоторые вычисления на основе до значений, полученных из базы данных, я ясно с моим внутренним расчетом, но вопросом в том, как создать динамический класс:Python: создание динамических функций

Моя структура что-то вроде этого:

class xyz: 

    def Project(): 

     start = 2011-01-03 

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

Теперь хочу, чтобы генерировать эти функции все PhaseX() динамически, может ли один предложить мне как добиться такого эффекта, используя Python код

Wait для положительного ответа С уважением Thank You

ответ

26

С closures.

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

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

caveats

1

Этот ответ может предполагать,

Вы бы рассмотрели что-то вроде следующего?

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

Вы можете использовать функцию типа для создания класса python динамически или метакласса. Ill описать первый метод:

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

Аргументы для типа: имя класса, класс базы (как кортеж), класс атрибутов в Словаре. Конечно, вы можете создавать эти параметры программно, как пожелаете.

1

Недавно я боролся с этим же вопросом, и я хотел, чтобы записать то, что я нашел, чтобы работать для меня ... используя оригинальный пример. Отличие от более раннего ответа заключается в том, что я использую setattr для создания имени функции (как части класса).

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' 
Смежные вопросы