使用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
。在
但是,它会扰乱属性的顺序。在
In [5]: Child(5, 10)
Out[5]: Child(y=5, x=10)
最后,我重新定义了子类中的所有属性(实际代码中有两个以上的属性)。在
有没有更优雅的方式来做这个?在
最后,我发现的最简单的解决方法是不在子类中使用验证器:
感谢布鲁诺·德斯韦利尔斯正确地指出了里斯科夫原则。 请注意,这个问题不仅发生在
@x.validator
中,而且也出现在其他构造中,例如属性default value@x.default
。在本例中,python3.7即将推出的dataclass
似乎比attrs
要好。在相关问题 更多 >
编程相关推荐