Каковы преимущества использования метаклассов в реализации django-подобных форм? - PullRequest
6 голосов
/ 30 марта 2011

Сначала немного предыстории ... Я просматривал исходный код Django для форм, чтобы понять реализацию форм в Django (и изучить немного Python по пути).Django реализует формы с использованием DeclaredMetaFields MetaClass .

Вот очень грубая диаграмма классов реализации Django-подобной формы ( ссылка на пример кода в gist).

Django-form-like implementation of ContactForm - Class Diagram

А вот примерная диаграмма.

Django-form-like implementation of ContactForm - Instance Diagram

Вот очень грубая реализация того же класса без обращения к мета-классам ( ссылка для примера кода в gist).

A simple and crude implementation of ContactForm

Я понимаю концепции метакласса и т. д. и понимаю, как работает код Django.Теперь о вопросах.

  1. Помимо очевидных преимуществ, таких как синтаксическая элегантность и т. Д., Есть ли какие-либо другие преимущества для реализации метакласса?
  2. Похожа ли реализация метаклассавозможно без обращения к промежуточному объекту, такому как BoundField?

1 Ответ

2 голосов
/ 30 марта 2011

Ну, синтаксические преимущества очень важны. Ведь даже уроки на языках ООП - это всего лишь синтаксическое преимущество языка.

В вашем примере очень грубой реализации реализации форм без мета-классов вы описываете поля в 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?). Но будет ли это легко использовать, легко понять, легко расширить?

...