Структура модели MVC в Python

У меня проблемы со структурированием классов в части модели шаблона MVC в моем приложении Python. Независимо от того, как я поворачиваю вещи, я продолжаю работать с циклическим импортом. Вот что у меня есть:

Модель / __ init__p.y

  • должен содержать все имена классов модели, поэтому Я могу сделать "от пользователя импорта модели" например от контроллера или устройства прецедент

Модель / Database.py

  • содержит класс базы данных
  • необходимо импортировать все классы модели для выполнения ORM
  • инициализация должна выполняться при первом импорте модуля, то есть без дополнительных вызовов инициализации или создания экземпляров (все методы в классе базы данных - это @classmethods)

Модель / User.py

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

Мне еще предстоит увидеть приложение Python в реальном мире, использующее MVC, поэтому мой подход, вероятно, не-Pythonic (и, возможно, не зависит от языка ...) - какие-либо предложения о том, как решить эту проблему?

Спасибо, Саймон

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
3 353
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Обычно мы помещаем все в один файл. Это не Java или C++.

Начните с одного файла, пока не получите больше опыта работы с Python. Если ваши файлы не гигантские, все будет нормально.

Например, Django поддерживает этот стиль, поэтому скопируйте их формулу успеха. Один модуль для модели. Модуль для каждого приложения; каждое приложение импортирует общую модель.

Ваша база данных и суперклассы могут быть в вашем файле __init__.py, поскольку они применяются ко всему пакету. Это может уменьшить некоторую округлость.

Хороший совет. Сохраняйте простоту, пока не приобретете больше опыта.

codeape 09.10.2008 14:56

Я думаю, у вас есть одна проблема, которую следует решить. Циркулярные ссылки часто возникают из-за невозможности разделения проблем. На мой взгляд, модули базы данных и модели не должны много знать друг о друге, вместо этого они работают с API. В этом случае база данных не должна напрямую ссылаться на какие-либо конкретные классы модели, а вместо этого должна обеспечивать функциональность, которая будет необходима классам модели. Модель, в свою очередь, должна получить ссылку на базу данных (введенную или запрошенную), которую она будет использовать для запроса и сохранения.

Ответ принят как подходящий

В вашей спецификации есть несоответствие. Вы говорите, что Database.py необходимо импортировать все классы модели для выполнения ORM, но затем вы говорите, что классу User требуется доступ к базе данных для выполнения запросов.

Думайте об этом как о слоях API. Класс Database предоставляет API (возможно, объектно-ориентированный) для некоторого физического уровня сохраняемости (например, DB-API 2.0). Классы модели, такие как User, используют уровень базы данных для загрузки и сохранения своего состояния. У класса Database.py нет причин импортировать все классы модели, и на самом деле вы этого не захотите, потому что вам придется изменять Database.py каждый раз, когда вы создаете новый класс модели, что является запахом кода. .

Другие вопросы по теме