假设我正在编写一个带有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而不是引发异常;我只是想让我的示例尽可能接近源材料。