在类似Django的表单实现中使用 metaclass 的优点是什么?
1 个回答
2
语法上的好处非常重要。毕竟,在面向对象编程(OOP)语言中,类的存在其实就是语言的一种语法优势。
在你提到的没有元类的简单实现中,你提到在字典(Dict)里描述字段。你可能没有注意到,这实际上是SortedDict,因为字段的顺序是很重要的。所以我还需要定义一个fields_order
的列表。
接下来一个重要的概念是ModelForm。使用元类的方法可以简单地告诉我使用哪个模型,以及在Meta
属性中哪些字段,这样它就会自动创建并映射字段到模型上。如果没有元类的方法,我可能需要使用类似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更易于使用。
当然,也可以不使用元类、绑定字段或其他任何东西。最终,确实可以把所有表单的实现写在一个函数里,把所有定义放在一个大的字典(或者xml?)中。但这样真的容易使用、容易理解、容易扩展吗?