Python:创建动态函数

时间:2011-01-03 06:38:39

标签: python

我有问题我想创建动态函数,它将根据从数据库中检索的值进行一些计算,我很清楚我的内部计算但是如何创建动态类的问题:

我的结构是这样的:

class xyz:

    def Project():

       start = 2011-01-03

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

现在想要动态生成所有PhaseX()函数,所以任何人都可以建议我 如何使用Python代码实现这样的事情

等待肯定回复 问候 谢谢

4 个答案:

答案 0 :(得分:29)

使用closures

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

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

caveats

答案 1 :(得分:1)

这个答案可能假设您的意图过于简单,但似乎您想为特定函数调用设置一个值。

您会考虑以下内容吗?

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

答案 2 :(得分: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'

答案 3 :(得分:0)

您可以使用type函数动态创建python类或元类。我描述了第一种方法:

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

要键入的参数是:类名,类库(作为元组),dict中的类属性。当然,您可以根据需要以编程方式构造这些参数。