【问题标题】:Update dataclass fields from a dict in python从python中的dict更新数据类字段
【发布时间】:2020-04-25 13:16:22
【问题描述】:

如何使用 dict 更新数据类的字段?

示例

@dataclass
class Sample:
    field1: str
    field2: str
    field3: str
    field4: str

sample = Sample('field1_value1', 'field2_value1', 'field3_value1', 'field4_value1')
updated_values = {'field1': 'field1_value2', 'field3': 'field3_value2'}

我想做类似的事情

sample.update(updated_values)

【问题讨论】:

    标签: python python-3.7 python-dataclasses


    【解决方案1】:

    您不必创建新类。您只需执行以下操作:

    @dataclass
    class Sample:
        field1: str
        field2: str
        field3: str
        field4: str
    
        def update(self, new):
            for key, value in new.items():
                if hasattr(self, key):
                    setattr(self, key, value)
    
    
    sample = Sample('field1_value1', 'field2_value1', 'field3_value1', 'field4_value1')
    updated_values = {'field1': 'field1_value2', 'field3': 'field3_value2'}
    sample.update(updated_values)
    
    

    编辑:修正错字class Sample(Updateable): -> class Sample:

    【讨论】:

    • 1.如果你没有定义一个可更新的类,你在class Sample(Updateable):这一行继承了哪个类? 2. 定义父类的好处是我可以在多个数据类中继承它,即我不需要在每个类中编写更新方法。
    • 1.那是一个错字,已在编辑中修复。 2. 如果您有多个数据类,这是正确的,但如果您只有一个,则没有必要。
    【解决方案2】:

    一种方法是创建一个小类并从中继承:

    class Updateable(object):
        def update(self, new):
            for key, value in new.items():
                if hasattr(self, key):
                    setattr(self, key, value)
    
    @dataclass
    class Sample(Updateable):
        field1: str
        field2: str
        field3: str
        field4: str
    

    如果您想了解有关 getattr 和 setattr 的更多信息,可以阅读this

    【讨论】:

      【解决方案3】:

      如果您有基本数据类,更新底层 __dict__ 似乎可行:

      sample.__dict__.update({ 'field1': 'value1' })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-21
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 2021-10-31
        • 2020-07-03
        • 1970-01-01
        相关资源
        最近更新 更多