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

时间:2017-03-14 11:28:25

标签: python python-3.x parameters method-overriding method-signature

我有一个Base类,有某种方法,没有任何参数:

class Base():

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

还有几个子类,他们需要在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))

因此,在这种情况下,我在类方法签名方面存在不一致。

另一方面,我可以处理基类中未使用的x参数:

class Base():

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

这有点无用,但保持签名的一致性。 什么是更好的方法?

1 个答案:

答案 0 :(得分:1)

在派生类中添加新属性/方法很好,删除它们并不是因为它违反了Liskov substitution principle

考虑一下:(现代)Python中的所有类都来自object,如果他们没有添加新的属性和/或方法,它们将毫无用处。因此,在派生类的__init__方法中添加新的args是完全正常的。

当然,如果您希望大多数派生类使用x参数,那么将它添加到基类中也是完美的,即使基类本身没有#&# 39;使用它。

在相关的说明中,通常的做法是将方法添加到基类本身不使用但希望派生类可以覆盖的基类。在这种情况下,基本方法引发NotImplemented是正常的。您不需要 在基类中提供此类方法,但如果有人忘记在派生类中提供方法,它确实会使错误消息更具信息性。