Python:解压方法中的字典

时间:2010-12-03 12:27:17

标签: python variables

在Python中,我想通过加载一些变量来创建一个新对象。最简单的方法是传递字典,但这使编程非常烦人:而不是self.health我必须一直调用self.params ['health']。有没有办法动态设置变量名称(字段)?

我有:

DEFAULT_PARAMS = {
    'health': 10,
    'position': []
}

def __init__(self, params = DEFAULT_PARAMS):
    self.params = params
    print self.params['health']

我希望:

DEFAULT_PARAMS = {
    'health': 10,
    'position': []
}

class Name():
    def load(self, params):
        # what goes here?

    def __init__(self, params = DEFAULT_PARAMS):
        self.load(params)
        print self.health

4 个答案:

答案 0 :(得分:5)

class Name(object):
    def __init__(self, *params):
        self.__dict__.update(DEFAULT_PARAMS)
        self.__dict__.update(params)

b = Name(position=[1,2])
print b.position

答案 1 :(得分:2)

您可以使用

setattr(self, name, value)

使用动态名称self和值name创建value的新属性。在您的示例中,您可以编写

def load(self, params):
    for name, value in params.iteritems():
        setattr(self, name, value)

答案 2 :(得分:2)

如果使用** kwargs语法,那么在创建对象时,这会使您的构造更加灵活:

class MyHealthClass(object):
    def __init__(self, *args, **kwargs):
        for key in kwargs:
            setattr(self, key, kwargs[key])
        if not hasattr(self, 'health'):
            raise TypeError('Needs a health')
        print self.health

然后你可以用这样的词典来调用它:

>>> myvar = MyHealthClass(**DEFAULT_PARAMS)
10

或使用关键字args:

>>> myvar = MyHealthClass(healh=10, wealth="Better all the time")
10
>>> print myvar.health
10
>>> print myvar.wealth
Better all the time

答案 3 :(得分:0)

您可以从字典中的项目中为实例创建属性:

def __init__(self, params=DEFAULT_PARAMS):
  ...
  for k,v in DEFAULT_PARAMS.iteritems():
    setattr(self, escape_attr_name(k), v)
  ...

escapse_attr_name中,您需要处理属性名称中不允许但在键中存在的字符。