Как динамически добавлять членов в класс - PullRequest
1 голос
/ 28 февраля 2011

Мой вопрос может быть просто проиллюстрирован следующим кодом:

def proceed(self, *args):
  myname = ???
  func = getattr(otherobj, myname)
  result = func(*args)
  # result = ... process result  ..
  return result


class dispatch(object):
  def __init__(self, cond=1):
    for index in range(1, cond):
      setattr(self, 'step%u' % (index,), new.instancemethod(proceed, self, dispatch)

После этого экземпляра отправки должны быть члены step1..stepn, которые вызывают соответствующие методы в otherobj.Как это сделать?Или более конкретно: что должно быть вставлено в продолжить после 'myname ='?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011

Если методы называются step1 to 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))

Если вы не знаете имя, я не понимаю, чего вы пытаетесь достичь.

2 голосов
/ 28 февраля 2011

Не уверен, что это работает, но вы можете попытаться использовать замыкания:

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))
...