【问题标题】:Python : creating dynamic functionsPython:创建动态函数
【发布时间】:2014-04-24 23:41:09
【问题描述】:

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

我的结构是这样的:

class xyz:

    def Project():

       start = 2011-01-03

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

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

等待肯定答复 问候 谢谢你

【问题讨论】:

    标签: python


    【解决方案1】:

    closures

    def makefunc(val):
      def somephase():
        return '%dd' % (val,)
      return somephase
    
    Phase2 = makefunc(2)
    Phase3 = makefunc(3)
    

    caveats

    【讨论】:

      【解决方案2】:

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

      您会考虑以下情况吗?

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

      【讨论】:

        【解决方案3】:

        我最近遇到了同样的问题,我想写下我发现对我有用的东西……使用原始示例。与先前答案的不同之处在于,我也使用 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'
        

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-02-09
            • 2012-07-02
            • 2016-10-11
            • 1970-01-01
            • 1970-01-01
            • 2021-08-11
            • 2021-02-16
            • 1970-01-01
            相关资源
            最近更新 更多