Несоответствие количества параметров в сигнатурах базовых и дочерних методов

У меня есть 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 ответ

Решение

Добавление новых атрибутов / методов в производный класс - это хорошо, удаление их не потому, что это нарушает принцип подстановки Лискова.

Обратите внимание: все классы в (современном) Python являются производными от objectи они были бы бесполезны, если бы они не добавляли новые атрибуты и / или методы. Поэтому совершенно нормально добавлять новые аргументы в производный класс __init__ метод.

Конечно, если вы ожидаете, что большинство производных классов будет использовать x аргумент, тогда совершенно нормально добавить его и в базовый класс, даже если сам базовый класс его не использует.

На заметку о том, что обычной практикой является добавление методов к базовому классу, которые сам базовый класс не использует, но которые должны переопределять производные классы. В таких случаях это нормально для базового метода, чтобы поднять NotImplemented, Вам не нужно предоставлять такие методы в базовом классе, но это делает сообщение об ошибке более информативным в случае, если кто-то забудет предоставить метод в своем производном классе.

Другие вопросы по тегам