我很惊讶地看到 Python - 至少部分地 - 似乎违反了一些 oo / SOLID 原则。
例子:
class FractionTuple(tuple):
def __new__(cls, p, q):
# Ensure that p and q are integers
if not isinstance(p, int) or not isinstance(q, int):
raise TypeError("Both elements must be integers")
# Create the tuple of length 2
return super().__new__(cls, (p, q))
从代码重用的角度来看,这似乎是一种可行的方法 - 然而它违反了可替换性原则:与基类相比,使用派生类
FractionTuple
的先决条件得到加强tuple
.
Liskov 替换原则 (LSP) 是面向对象编程中关于子类建模条件的标准。它声明使用基类对象的程序也必须在不更改程序的情况下正确地使用派生子类的对象。就个别方法而言,这意味着当一个方法被派生类覆盖时,前置条件可能只会被削弱,而后置条件只会被加强。一个常见的违反 LSP 的例子是基类
ellipse
和派生类circle
.
这种违规行为在 Python 中很常见吗?还是 FractionTuple 是个例外?