Python:在方法中解包字典

2 投票
4 回答
4082 浏览
提问于 2025-04-16 07:58

在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

撰写回答