在类似django的表单实现中使用元类有什么好处?

时间:2011-03-30 00:54:58

标签: python django oop class metaclass

首先是一个小背景......我正在浏览Django的源代码,以了解Django中表单的实现(以及沿途学习一些Python)。 Django使用DeclaredMetaFields MetaClass 实现表单。

这是一个类似Django的表单实现的粗略类图(link,用于在gist中对代码进行示例)。

Django-form-like implementation of ContactForm - Class Diagram

这是一个实例图。

Django-form-like implementation of ContactForm - Instance Diagram

这是一个非常粗略的实现,同一个类没有求助于元类(link来对gist中的代码进行示例)。

A simple and crude implementation of ContactForm

我理解元类概念等,并了解Django代码的工作原理。现在提问。

  1. 除了语法优雅等明显的好处之外,元类实现还有其他好处吗?
  2. 如果不使用像BoundField这样的中间对象,可以实现类类实现吗?

1 个答案:

答案 0 :(得分:2)

语法上的好处很重要。毕竟OOP语言中的所有偶数只是该语言的语法优势。

在您非常粗略地实现无元类表单实现的示例中,您将在Dict中描述字段。那么你可能忽略了它实际上是SortedDict,因为字段的排序很重要。所以我还需要定义fields_order列表。

下一件大事是ModelForm。元类方法允许简单地说我使用哪个模型以及Meta属性中的哪些字段,它自动创建并将字段映射到模型。如果没有Metaclass方法,我可能不得不使用CreateFieldsFromModelMapFieldsToModel之类的东西。或者你可以用__init__方法为我做这件事。但是等等,__init__方法已经很复杂,包含很多参数,例如datainitialfiles等等。

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?)中但是这样易于使用,易于理解,易于扩展吗?