首先是一个小背景......我正在浏览Django的源代码,以了解Django中表单的实现(以及沿途学习一些Python)。 Django使用DeclaredMetaFields MetaClass 实现表单。
这是一个类似Django的表单实现的粗略类图(link,用于在gist中对代码进行示例)。
这是一个实例图。
这是一个非常粗略的实现,同一个类没有求助于元类(link来对gist中的代码进行示例)。
我理解元类概念等,并了解Django代码的工作原理。现在提问。
答案 0 :(得分:2)
语法上的好处很重要。毕竟OOP语言中的所有偶数只是该语言的语法优势。
在您非常粗略地实现无元类表单实现的示例中,您将在Dict中描述字段。那么你可能忽略了它实际上是SortedDict,因为字段的排序很重要。所以我还需要定义fields_order
列表。
下一件大事是ModelForm。元类方法允许简单地说我使用哪个模型以及Meta
属性中的哪些字段,它自动创建并将字段映射到模型。如果没有Metaclass方法,我可能不得不使用CreateFieldsFromModel
和MapFieldsToModel
之类的东西。或者你可以用__init__
方法为我做这件事。但是等等,__init__
方法已经很复杂,包含很多参数,例如data
,initial
,files
等等。
class MyForm(Form):
fields = {
'one': ...
...
}
fields_order = [...]
model_fields = ???
Class MyForm2(MyForm):
fields = MyForm.fields + {...}
# ... hey this API sucks! I think I'll go with another framework.
还有很多东西可以在表格中配置,一切都记录下来。
对我来说,由于庞大的配置逻辑,它看起来像Form
只是要求通过定义对象和工厂逻辑来实现。这里有python及其元类来隐藏工厂和用户。它很酷,因为它让初学者更少思考。
还有它的语法糖,以及制作易于使用的API。
是的,有可能不使用Metaclasses / BoundField或其他任何东西。最后,可以在一个函数中编写表单的所有实现,并将所有定义都放在一个大字典(或xml?)中但是这样易于使用,易于理解,易于扩展吗?