Каковы преимущества использования метаклассов в реализациях, похожих на джанго?

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

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

Django-подобная реализация схемы ContactForm - Class

И вот диаграмма экземпляра.

Django-подобная реализация схемы ContactForm - Instance

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

Простая и грубая реализация ContactForm

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

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

Хорошие синтаксические преимущества имеют большое значение. Ведь даже классы в языках ООП – это просто синтаксическое преимущество языка.

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