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

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

2 голосов
/ 09 октября 2008

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

Модель / __ init__p.y

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

Model / Database.py

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

Модель / User.py

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

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

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

Ответы [ 3 ]

6 голосов
/ 09 октября 2008

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

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

3 голосов
/ 09 октября 2008

Как правило, мы помещаем все это в один файл. Это не Java или C ++.

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

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

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

1 голос
/ 09 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...