将所有字段从一个数据类实例复制到另一个实例的最简单方法?

新手上路,请多包涵

假设您已经定义了一个 Python 数据类:

 @dataclass
class Marker:
    a: float
    b: float = 1.0

将值从实例 marker_a 复制到另一个实例 marker_b 的最简单方法是什么?

这是我尝试实现的示例:

 marker_a = Marker(1.0, 2.0)
marker_b = Marker(11.0, 12.0)
# now some magic happens which you hopefully can fill in
print(marker_b)
# result: Marker(a=1.0, b=2.0)

作为边界条件,我 不想 创建新实例并将其分配给 marker_b

好的,我 可以 遍历所有定义的字段并一个一个地复制值,但我想必须有一个更简单的方法。

原文由 Tom Pohl 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 562
2 个回答

我认为遍历字段可能是最简单的方法。我能想到的所有其他选项都涉及创建一个新对象。

 from dataclasses import fields

marker_a = Marker(5)
marker_b = Marker(0, 99)

for field in fields(Marker):
    setattr(marker_b, field.name, getattr(marker_a, field.name))

print(marker_b)  # Marker(a=5, b=1.0)

原文由 Patrick Haugh 发布,翻译遵循 CC BY-SA 4.0 许可协议

dataclasses.replace 函数返回对象的新副本。在不传递任何更改的情况下,它将返回一个没有修改的副本:

 >>> import dataclasses
>>> @dataclasses.dataclass
... class Dummy:
...     foo: int
...     bar: int
...
>>> dummy = Dummy(1, 2)
>>> dummy_copy = dataclasses.replace(dummy)
>>> dummy_copy.foo = 5
>>> dummy
Dummy(foo=1, bar=2)
>>> dummy_copy
Dummy(foo=5, bar=2)

请注意,这是一个浅拷贝。

编辑以解决评论:

如果不需要副本,我可能会选择以下内容:

 for key, value in dataclasses.asdict(dummy).items():
    setattr(some_obj, key, value)

原文由 Daniel Perez 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题