我可以使用基类实例初始化一个派生数据类吗?

5

简单来说,如果我有一个基类:

@dataclass
class Base:
  foo: int
  bar: int

和派生类:

@dataclass
class Derived(Base):
  baz: int

我想要做这件事:

base = Base(1, 2)
derived = Derived(base, 3)

但是这会将base分配给derived.foo。有没有一种方法可以以这样的方式完成它,而无需迭代每个字段?例如,我可以将base序列化为JSON,添加其他字段,然后反序列化到derived中,但这似乎有点糊弄。

3
编写你自己的 __init__。或者更好的是,编写一个另外的构造函数 from_base(base, baz) - juanpa.arrivillaga
即使使用我的初始化,我仍然需要(据我所知)手动遍历每个字段,而我正试图避免这种情况;我希望一个类可以像数组一样被解构,但似乎不行。 - Rollie
你为什么想要避免那个?直接去做就好了。如果你真的必须这样做,你可以动态地使用__dict__来玩弄它,但你必须知道自己在做什么,而且无论如何,这只会让你的代码更加复杂,实际上没有任何好处。 - juanpa.arrivillaga
你为什么需要先创建 Base 实例?仅为了制作子实例而构建一个实例似乎有点毫无意义。 - ShadowRanger
@wim 确实可以工作!如果您能回答,我会接受的。我不知道数据类构造函数默认接受字典 - 感谢您的帮助(特别是没有批评地问“但为什么…” :)) - Rollie
1个回答

4

当创建另一个实例时,您可以解压其中一个实例的字段:

>>> from dataclasses import asdict
>>> Derived(**asdict(base), baz=3)  # by keyword
Derived(foo=1, bar=2, baz=3)
>>> Derived(*asdict(base).values(), 3)  # positional
Derived(foo=1, bar=2, baz=3)

请注意使用asdict会进行深层复制,这样就不会意外共享任何引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接