基本方法和子方法签名中的参数数量不一致

Inconsistency in number of parameters in base and child methods signatures

我有一个 Base class 具有特定方法和 w/o 任何参数:

class Base():

    def pretty_method(self):
        print('Hi!')

还有几个子classes,它们需要在pretty_method中使用新参数x进行额外处理。

class A(Base):

    def pretty_method(self, x):
        super().pretty_method()
        print('X in A is {}'.format(x))

class B(Base):

    def pretty_method(self, x):
        super().pretty_method()
        print('X in B is {}'.format(x))

所以在那种情况下,我在 class 方法签名中存在不一致。

另一方面,我可以处理 base class:

中未使用的 x 参数
class Base():

    def pretty_method(self, x=None):
        print('Hi!')

这有点没用,但可以保持签名的一致性。 哪种方法更可取?

在派生的 class 中添加新属性/方法是可以的,删除它们不是因为它违反了 Liskov substitution principle

考虑:(现代)Python 中的所有 class 都派生自 object,如果不添加新的属性和/或方法,它们将毫无用处。因此,将新参数添加到派生的 class 的 __init__ 方法中是完全正常的。

当然,如果您希望派生的大多数 class 使用 x 参数,那么也可以将它添加到基础 class 中,即使尽管基础 class 本身并不使用它。

在相关说明中,通常的做法是向基 class 添加方法,基 class 本身不使用但派生的 class 是预期的覆盖。在这种情况下,基本方法引发 NotImplemented 是正常的。您 不需要 在基础 class 中提供此类方法,但如果有人忘记在其派生 class.