数据类的子类,带有一些断言

2024-05-01

我有一个冻结的数据类MyData保存数据。 我想要一个杰出的子类MySpecialData只能保存长度为1的数据。 这是一个有效的实现。

from dataclasses import dataclass, field


@dataclass(frozen=True)
class MyData:
    id: int = field()
    data: list[float] = field()

    def __len__(self) -> int:
        return len(self.data)


@dataclass(frozen=True)
class MySpecialData(MyData):
    def __post_init__(self):
        assert len(self) == 1


# correctly throws exception
special_data = MySpecialData(id=1, data=[2, 3])

我花了一些时间搞乱__new__ and __init__,但无法达成有效的解决方案。 该代码有效,但我是一个新手,正在征求有经验的人的意见,如果这是完成此任务的“正确”方法。 任何关于如何更好或更正确地做到这一点的批评或建议将不胜感激。

对于不使用的示例dataclasses,我想正确的方法是压倒一切的__new__在子类中。 我怀疑我试图推翻__new__由于特殊的方式这里失败了dataclasses作品。 你同意吗?

谢谢您的意见。


不要使用assert. Use

if len(self) != 1:
    raise ValueError

assert可以通过关闭-O切换即,如果你像这样运行你的脚本

python -O my_script.py

它不会再引发错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据类的子类,带有一些断言 的相关文章

随机推荐