Python更新字典中的对象

cha*_*rit 19 python iterable-unpacking

是否有内置函数/运算符可用于从字典中解压缩值并将其分配给实例变量?

这就是我打算做的事情:

c = MyClass()
c.foo = 123
c.bar = 123

# c.foo == 123 and c.bar == 123


d = {'bar': 456}
c.update(d)

# c.foo == 123 and c.bar == 456
Run Code Online (Sandbox Code Playgroud)

类似于字典的东西,update()它从另一个字典加载值但是对于普通对象/类实例?

Jeh*_*iah 33

通过循环遍历d中的项目,还有另一种方法.这没有他们将被存储的相同的后果,但c.__dict__并不总是如此.

d = {'bar': 456}
for key,value in d.items():
    setattr(c,key,value)
Run Code Online (Sandbox Code Playgroud)

或者你可以写一个update方法作为一部分,MyClass以便c.update(d)像你期望的那样工作.

def update(self,newdata):
    for key,value in newdata.items():
        setattr(self,key,value)
Run Code Online (Sandbox Code Playgroud)

看看setattr的帮助

setattr(...)
    setattr(object, name, value)
    Set a named attribute on an object; setattr(x, 'y', v) is equivalent to
    ''x.y = v''.
Run Code Online (Sandbox Code Playgroud)

  • 当然,主要区别在于类属性和实例属性之间.只有后者在`__dict__`中.所以如果你有类Test:a = 1 t = Test()对象`t`有一个空的`__dict__`,因为a是一个类属性tb = 2现在它有一个`_'_dict__```''b':2 }` (7认同)
  • 我已经知道了setattr ...你能解释为什么有些项目不会出现在__dict__中吗?我实际上最终仍然使用这种循环+ setattr,因为__dict__不知何故不可用. (3认同)

S.L*_*ott 30

你有没有尝试过

f.__dict__.update( b )
Run Code Online (Sandbox Code Playgroud)

  • 当类属性未存储在实例的`__dict__`中时,这将默默地行为不端.例如,属性和类属性.一般来说,耶希亚的答案更安全. (9认同)
  • 谢谢!很难用谷歌获取这种信息。 (2认同)

hyp*_*ean 7

另外,也许在dict的更新方法周围有一个包装器是好的风格:

def update(self, b):
    self.__dict__.update(b)
Run Code Online (Sandbox Code Playgroud)

PS:很抱歉没有评论@ S.Lott的帖子,但我还没有代表.