我有问题我想创建动态函数,它将根据从数据库中检索的值进行一些计算,我很清楚我的内部计算但是如何创建动态类的问题:
我的结构是这样的:
class xyz:
def Project():
start = 2011-01-03
def Phase1():
effort = '2d'
def Phase2():
effort = '3d'
def Phase3():
effort = '4d'
现在想要动态生成所有PhaseX()函数,所以任何人都可以建议我 如何使用Python代码实现这样的事情
等待肯定回复 问候 谢谢
答案 0 :(得分:29)
使用closures。
def makefunc(val):
def somephase():
return '%dd' % (val,)
return somephase
Phase2 = makefunc(2)
Phase3 = makefunc(3)
答案 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中的类属性。当然,您可以根据需要以编程方式构造这些参数。