Несоответствие количества параметров в сигнатурах базовых и дочерних методов
У меня есть 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
, Вам не нужно предоставлять такие методы в базовом классе, но это делает сообщение об ошибке более информативным в случае, если кто-то забудет предоставить метод в своем производном классе.