Python:在方法中解包字典
在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 个回答
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
或者使用关键字参数来调用:
>>> myvar = MyHealthClass(healh=10, wealth="Better all the time")
10
>>> print myvar.health
10
>>> print myvar.wealth
Better all the time
2
你可以使用
setattr(self, name, value)
来为self
创建一个新的属性,这个属性的名字是动态的,也就是可以根据需要变化的name
,而它的值是value
。在你的例子中,你可以这样写
def load(self, params):
for name, value in params.iteritems():
setattr(self, name, value)
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