当前位置:  开发笔记 > 编程语言 > 正文

Python更新字典中的对象

如何解决《Python更新字典中的对象》经验,为你挑选了3个好方法。

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

这就是我打算做的事情:

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

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



1> Jehiah..:

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

d = {'bar': 456}
for key,value in d.items():
    setattr(c,key,value)

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

def update(self,newdata):
    for key,value in newdata.items():
        setattr(self,key,value)

看看setattr的帮助

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


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

2> S.Lott..:

你有没有尝试过

f.__dict__.update( b )


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

3> hyperboreean..:

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

def update(self, b):
    self.__dict__.update(b)

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

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有