假设我正在编写一个带有Form
类的 webapp,而一个Form
类可以有多个Fields
.
Field
本身就是一个抽象类。它包含一个抽象validators
属性,它是一个方法列表,它将调用以确定字段的内容是否有效。这些验证器通过调用实例方法来调用Field.run_validators(value)
CharField
是一个Field
允许任意文本的子类。这个字段总是有效的,只要给它一些非零长度的字符串。
EmailField
是CharField
具有附加要求的子类。此字段仅在value
通过一组某种测试时才有效。(例如'@' in value
)。
我的问题是:是否会EmailField
破坏 LSP CharField
?它应该是一个兄弟类吗?尽管Field
通过允许子类提供自己的 来定义可变性validators
,TextField
但并未明确扩展该可变性。
我一直试图找到更多关于 LSP 的解释,但它们都重用了相同的 Rectangle/Square 示例。
鉴于:
def transmogulate(field):
"""field must be a TextField instance."""
assert isinstance(field, TextField)
instance.run_validators("hello")
使用时CharField
,transmogulate(my_text_field)
将毫无问题地运行。但是如果my_text_field
是一个实例EmailField
,它总是会引发一个ValidationError
. 这是否违反了 LSP?还是我的推理完全倒退了?(这经常发生)
如果以某种方式改变分析,您也可以愉快地想象run_validators()
返回False
而不是引发异常;我只是想让我的示例尽可能接近源材料。