Один из вариантов - использовать класс Mixin;пример:
Во-первых, в mixin входит обычное поведение:
class SomeMixin(object):
def __init__(self, *args, **kwargs):
super(SomeMixin, self).__init__(*args, **kwargs)
for name, field in self.fields.iteritems():
field.widget = field.hidden_widget()
field.required = False
В той степени, в которой вы контролируете все классы в графе наследования и до тех пор, покавы вызываете super
в каждом методе, который необходимо переопределить, тогда не имеет большого значения, как выглядят производные классы.
Однако вы сталкиваетесь с проблемой, когда один из суперклассов сам не вызывает super
в нужное время.Очень важно, чтобы переопределенный метод, в этом случае, вызывался last , так как после его вызова больше вызовов не будет.
Самое простое решение - убедиться, что каждый класс на самом деле является производным от суперкласса-нарушителя, но в некоторых случаях это просто невозможно;создание нового класса создает новый объект, который вы на самом деле не хотите существовать!Другая причина может заключаться в том, что логический базовый класс находится слишком далеко в дереве наследования, чтобы с ним работать.\
В этом случае вам необходимо обратить особое внимание на порядок , в котором перечислены базовые классы.Python сначала рассмотрит крайний левый суперкласс, если на диаграмме наследования не указан более производный класс.Это сложная тема, и чтобы понять, что на самом деле задумывает python, вы должны прочитать об алгоритме C3 MRO , представленном в python 2.3 и более поздних версиях.
Базовые классы, как и раньше,весь общий код взят из mixin, производные классы становятся тривиальными
class HiddenSlideForm(SomeMixin, SlideForm):
pass
class HiddenDeckForm(SomeMixin, DeckForm):
pass
Обратите внимание, что класс mixin появляется first , так как мы не можем контролировать, какие классы *Form
сделать в их методах инициализации.
Если методы __init__
любого из них нетривиальны, вы все равно получаете выигрыш.
class HiddenSlideForm(SomeMixin, SlideForm):
def __init__(self, *args, **kwargs):
super(HiddenSlideForm, self).__init__(*args, **kwargs)
do_something_special()
Убедитесь, что object
находится на диаграмме наследования где-то,Иначе могут случиться странные вещи.