Как мне создать фабричный метод в Python, который генерирует разные классы?

#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'))