代码之家  ›  专栏  ›  技术社区  ›  chakrit Dutchie432

从字典中更新Python对象

  •  35
  • chakrit Dutchie432  · 技术社区  · 17 年前

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

    我打算这样做:

    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() 除了普通对象/类实例,哪些从另一个字典加载值?

    4 回复  |  直到 17 年前
        1
  •  51
  •   ViaTech    7 年前

    还有另一种方法,即循环遍历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''.
    
        2
  •  36
  •   S.Lott    17 年前

    你试过了吗

    f.__dict__.update( b )
    

    ?

        3
  •  9
  •   Community Mohan Dere    8 年前

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

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

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

        4
  •  1
  •   Trong Pham    7 年前

    您可以尝试执行以下操作:

    def to_object(my_object, my_dict):
        for key, value in my_dict.items():
            attr = getattr(my_object, key)
            if hasattr(attr, '__dict__'):
                to_object(attr, value)
            else:
                setattr(my_object, key, value)
    
    obj = MyObject()
    data = {'a': 1, 'b': 2}
    to_object(obj, data)
    
    推荐文章