Dict键作为类中的函数

时间:2010-12-13 21:33:30

标签: python

如何在下面的代码中从字典中调用get_productname函数?

test = {
       'get_productname' : {
                         'id' : 1,
                         'active' : 1,
                         }
    }

class search(object):
    def __init__(self):
        for key, value in test.items():
            if test[key]['active']:
                ... here i want to call the "get_productname" function from the dict key name
                self.key()
                ... HOW CAN I DO THIS?

    def get_productname(self, id):
        ...
        return productname 

4 个答案:

答案 0 :(得分:7)

您需要getattr功能。

class search(object):
  def __init__(self):
    for key, value in test.items():
      if test[key]['active']:
        getattr(self, key)(test['key']['id'])

根据评论,如果您不是100%肯定该方法将存在,您可以提前执行hasattr(self, name)检查,但它等同于:

try:
  getattr(self, key)
except AttributeError, e:
  # code here that would handle a missing method.

答案 1 :(得分:3)

如果您事先知道要调用的方法属于哪个类,则可以使用方法本身而不是其名称作为字典键。然后你可以简单地打电话给他们:

class search(object):
    def __init__(self, test):
        for func, value in test.iteritems():
            if value['active']:
                func(self, value['id'])
    def get_productname(self, id):
        pass

test = {search.get_productname: {'id' : 1, 'active' : 1}}

答案 2 :(得分:0)

假设您在某处定义了get_productname()函数,我只需将其添加到字典中,如下所示:

test = {
       'get_productname' : {
                         'id' : 1,
                         'active' : 1,
                         'func' : get_productname
                         }
    }

然后你可以这样称呼它:

class search(object):
    def __init__(self):
        for key, value in test.items():
            if test[key]['active']:
                # then call the associated function like this
                test[key]['func']()
                ...

希望有所帮助。

答案 3 :(得分:0)

即使人们可能会因为暗示这一点而激怒我:

http://docs.python.org/library/functions.html#eval

试试这个:

test = {
       'get_productname' : {
                         'id' : 1,
                         'active' : 1,
                         }
    }

class search(object):
    def __init__(self):
        for key, value in test.items():
            if test[key]['active']:
                eval("self.%s()" % key)
                # or, if you want to pass ID as an arg:
                eval("self.%(method_name)s(id=%(id)s)" % \
                      dict(method_name=key, id=value["id"])

    def get_productname(self, id):
        ...
        return productname 

没有运行它,但这应该有用。