6

如何从字典中更新类变量?我想出了一个肮脏的技巧,但我正在寻找(如果有的话)更整洁的东西。

假设我想要一个 C 类,其参数将根据给定的字典设置。因此,c 应该有

class C:
    def setVar(self, var):
        for key in var.keys():
            exec('self.{} = {}'.format(key, var[key]))

D = {'a':1, 'b':2, 'c':3}
c = C()
c.setVar(D)

# c.a = 1
# c.b = 2
# c.c = 3
4

2 回答 2

10

这正是setattr为了:

def setVar(self, var):
    for key, value in var.items():
        setattr(self, key, value)

更一般地说,几乎任何时候你发现自己在看evalor exec,寻找一个像setattrfirst 这样的反射函数,你几乎总能找到一个。


如果您知道您的类正在使用简单__dict__的实例属性,并且所有这些都是实例属性(这是标准情况 - 如果您不知道所有这些意味着什么,那么您的代码也是如此),您可以这样做快速和肮脏的黑客:

def setVar(self, var):
    self.__dict__.update(var)

然而,setattr在任何有意义的情况下都可以工作,并且在大多数情况下都失败了,当然,它准确地说明了它在做什么——它在selfnamed keyto上设置一个属性value,但是该属性是存储的——使它更干净。

于 2013-08-15T23:02:05.227 回答
0

这个怎么样?

def setVar(self, var):
    for key, value in var.iteritems():
        setattr(self, key, value)
于 2013-08-15T23:01:51.420 回答