Предположим, что следующая иерархия классов с базовым классом и некоторым общим классом дел, который наследуется от базового:
class BaseClass:
def f(self, a, b):
#do something
pass
class GeneralCase(BaseClass):
def f(self, a, b):
BaseClass.f(self, a, b)
#do something else
Теперь предположим, что у нас есть особый случай, в котором (среди прочего) один из аргументов функции f
является предопределенным и постоянным. Один
способ реализовать это состоит в том, чтобы удалить этот аргумент из списка аргументов следующим образом:
class SpecialCase1(GeneralCase):
def f(self, a):
Pro's: чистый, явный
Con: различная сигнатура метода может вызвать проблемы при использовании объектов разных классов
Вариант 2: установить значение по умолчанию и подтвердить, что оно не изменилось
class SpecialCase2(GeneralCase):
def f(self, a, b=PREDEFINED_VALUE):
assert b == PREDEFINED_VALUE
GeneralCase.f(self, a, PREDEFINED_VALUE)
Pro's: та же подпись
Con's: сбивающий с толку интерфейс: «Почему у нас есть параметр b? Что произойдет, если я его изменю?»
Какой подход вы бы предпочли и почему?