在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
答案 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
中,您需要处理属性名称中不允许但在键中存在的字符。