#python
#python
Вопрос:
В настоящее время у меня есть следующее:
class ConfirmStepAView(UpdateProcessView):
form_class = ConfirmationForm
def validate(self):
if not self.process.A:
raise ValidationError
class ConfirmStepBView(UpdateProcessView):
form_class = ConfirmationForm
def validate(self):
if not self.process.B:
raise ValidationError
# Usage:
flow.View(ConfirmStepAView)
flow.View(ConfirmStepBView)
Как я могу написать фабричный метод, который генерирует эти классы «на лету», чтобы я мог делать что-то вроде этого?
flow.View(ConfirmStepViewFactory('A'))
flow.View(ConfirmStepViewFactory('B'))
flow.View(ConfirmStepViewFactory('Something'))
flow.View(ConfirmStepViewFactory('Else'))
Примечание: Я должен использовать этот формат, потому что я работаю с библиотекой третьей части.
Ответ №1:
Это распространенный шаблон. Вы можете использовать замыкания в python для динамического создания и возврата вашего класса.
def make_ConfirmStepView(attribute):
class ConfirmStepView(UpdateProcessView):
form_class = ConfirmationForm
def validate(self):
if not getattr(self.process, attribute):
raise ValidationError
return ConfirmStepView
flow.View(make_ConfirmStepView('A'))
flow.View(make_ConfirmStepView('B'))
flow.View(make_ConfirmStepView('Something'))
flow.View(make_ConfirmStepView('Else'))