【问题标题】:How to dynamically add members to class如何动态添加成员到类
【发布时间】:2011-07-05 20:16:37
【问题描述】:

这段代码可以简单地说明我的问题:

def 继续(自我,* args): 我的名字 = ??? func = getattr(otherobj, myname) 结果 = 函数(*args) # 结果 = ... 处理结果 .. 返回结果 类调度(对象): def __init__(self, cond=1): 对于范围内的索引(1,cond): setattr(self, 'step%u' % (index,), new.instancemethod(proceed, self, dispatch)

在该调度实例必须有 step1..stepn 成员之后,该调用 otherobj 中的相应方法。怎么做?或者更具体地说:必须是什么 在 'myname =' 之后插入继续?

【问题讨论】:

    标签: python class dynamic members


    【解决方案1】:

    不确定这是否有效,但您可以尝试利用闭包:

    def make_proceed(name):
        def proceed(self, *args):
            func = getattr(otherobj, name)
            result = func(*args)
            # result = ... process result  ..
            return result
        return proceed
    
    
    class dispatch(object):
      def __init__(self, cond=1):
        for index in range(1, cond):
          name = 'step%u' % (index,)
          setattr(self, name, new.instancemethod(make_proceed(name), self, dispatch))
    

    【讨论】:

      【解决方案2】:

      如果方法被称为 step1 到 stepn,你应该这样做:

      def proceed(myname):
          def fct(self, *args):
              func = getattr(otherobj, myname)
              result = func(*args)
              return result
          return fct
      
      class dispatch(object):
          def __init__(self, cond=1):
              for index in range(1, cond):
                  myname = "step%u" % (index,)
                  setattr(self, myname, new.instancemethod(proceed(myname), self, dispatch))
      

      如果你不知道名字,我不明白你想要达到什么目的。

      【讨论】:

      • 和我的想法一样 :) 你忘了从 proceed 返回本地函数。
      • 是的。但是你,Space_C0wb0y,也忘记了...... :) 好的,谢谢你们的回答,我知道了! :)
      猜你喜欢
      • 2022-11-29
      • 1970-01-01
      • 2011-01-05
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多