在数据类的自定义__init__中调用生成的__init__覆盖

完全困惑

目前我有这样的事情:

@dataclass(frozen=True)
class MyClass:
  a: str
  b: str
  c: str
  d: Dict[str, str]

...除了dicts是可变的之外,这一切都很好,所以我不能使用我的班级去键入另一个字典。

相反,我希望fieldd类似于a FrozenSet[Tuple[str, str]],但是我仍然希望有人构造我的类的实例,以便能够在构造函数上传递字典,因为这更加直观。

所以我想做些类似的事情

@dataclass(frozen=True)
class MyClass:
  a: str
  b: str
  c: str
  d: FrozenSet[Tuple[str, str]] = field(init=False)

  def __init__(self, a, b, c, d: Dict[str, str]):
    self.original_generated_init(a, b, c)  # ???
    object.setattr(self, 'd', frozenset(d.items()))  # required because my dataclass is frozen

我该如何实现?另外,是否有更优雅的方法可以实现相同目的?

客人

您可以使用InitVar并分配给d__post_init__

@dataclass(frozen=True)
class MyClass:
  a: str
  b: str
  c: str
  d: FrozenSet[Tuple[str, str]] = field(init=False)
  d_init: InitVar[Dict[str, str]]

  def __post_init__(self, d_init):
    object.__setattr__(self, 'd', frozenset(d_init.items()))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章