pythonattrs:子类中的验证器

2024-05-16 20:23:05 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python模块attrs,我试图让一个子类的属性条件比其父类的限制更严格,如下面的最小示例所示。在

import attr

@attr.s
class Base:
    x = attr.ib()
    y = attr.ib()

@attr.s
class Child(Base):

    @x.validator
    def _x_validator(self, a, x):
        if x < 0:
            raise ValueError()

像上面这样定义验证器会引发一个错误(NameError: name 'x' is not defined)。在

我找到了一个解决方法,在子类中重新定义x。在

^{pr2}$

但是,它会扰乱属性的顺序。在

In [5]: Child(5, 10)
Out[5]: Child(y=5, x=10)

最后,我重新定义了子类中的所有属性(实际代码中有两个以上的属性)。在

有没有更优雅的方式来做这个?在


Tags: 模块importchild示例base属性定义def
1条回答
网友
1楼 · 发布于 2024-05-16 20:23:05

最后,我发现的最简单的解决方法是不在子类中使用验证器:

@attr.s
class Child(Base):
    def __attrs_post_init__(self):
        assert self.x > 0

感谢布鲁诺·德斯韦利尔斯正确地指出了里斯科夫原则。 请注意,这个问题不仅发生在@x.validator中,而且也出现在其他构造中,例如属性default value@x.default。在本例中,python3.7即将推出的dataclass似乎比attrs要好。在

相关问题 更多 >