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'))
注意:我必须使用这种格式,因为我正在使用第三方库。
解决方案
这是一种常见的模式。您可以利用 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'))
推荐阅读
- xml - 带有 MS Edge Beta (v91) 的 Selenium 不会在没有提示的情况下下载 XML 文件(这种类型的文件可能会损坏您的设备)
- ssl - 使用 arm64 程序集的 HTTPs POST 请求
- python - Python 代码在客户端启动之前不会执行,即使 print() 正在正确执行
- javascript - 如何在 jquery 中单击获取动态元素的值
- shapefile - 如何修复错误原因:java.lang.OutOfMemoryError:geoserver 中的 Java 堆空间
- wordpress - 更改或重定向默认 WPML 语言的 Wordpress URL 代码
- java - 将 Lambda 用作 AWS Lex 的代码挂钩时出错
- python-3.x - Python3 - 在评估之前将循环输出组合在一起?
- python - 根据标签内容调整 QTabWidget 大小的问题 (PyQT)
- html - 如何使用文本框中的模式字段在 html 中使用正则表达式验证字符串?