Я часто нахожу себя переписыванием методов родительского класса и никогда не могу решить, должен ли я явно перечислять данные параметры или просто использовать конструкцию скрытого *args, **kwargs
. Является ли одна версия лучше, чем другая? Есть ли наилучшая практика? Какие (недостатки) мне не хватает?
class Parent(object):
def save(self, commit=True):
# ...
class Explicit(Parent):
def save(self, commit=True):
super(Explicit, self).save(commit=commit)
# more logic
class Blanket(Parent):
def save(self, *args, **kwargs):
super(Blanket, self).save(*args, **kwargs)
# more logic
Воспринимаемые преимущества явного варианта
- Более явный (Zen of Python)
- легче понять
- параметры функции легко доступны
Воспринимаемые преимущества защитного варианта
- больше DRY
- родительский класс легко взаимозаменяем.
- изменение значений по умолчанию в родительском методе распространяется без касания другого кода.