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

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

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

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

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

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

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

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

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

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

One Solution collect form web for “Каковы преимущества использования метаклассов в реализациях, похожих на джанго?”

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

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

  • Вызов нестатического метода из статического в Python
  • Питонический способ реализации типов данных (Python 2.7)
  • Переопределение переменных класса в python
  • Могу ли я предоставить метод класса Python в качестве параметра?
  • Тройное наследование вызывает конфликт метакласса ... Иногда
  • Использование класса в Python
  • Есть ли способ распечатать короткую версию docstring для всех членов объекта Python?
  • Подклассификация класса с частными членами
  •  
    Interesting Posts for Van-Lav

    Matplotlib – Как сделать прозрачный цвет лица маркера прозрачным, не делая прозрачную линию

    Формирование прогнозов из предполагаемых параметров в pymc3

    Фрагменты против аббревиатур в Vim

    Как движок приложения (python) управляет памятью по запросам (предел превышен лимитированной частной памяти)

    Настройка мезонина

    Максимальное и минимальное значения для ints

    Настройка пушки для Django на Heroku

    Django python manage.py migrate

    Как импортировать класс Python, который находится в каталоге выше?

    Использование специальных интеллектуальных указателей в boost python

    линейные комбинации в python / numpy

    Python в операционной системе реального времени (RTOS)

    Почему соединение не удалось для ipv6 на python?

    Должны ли соединения PostgreSQL объединяться в веб-приложение Python или создавать новое соединение для каждого запроса?

    объединение файлов на основе координат столбца двух файлов в python

    Python - лучший язык программирования в мире.