У меня проблемы со структурированием классов в части модели шаблона MVC в моем приложении Python. Независимо от того, как я поворачиваю вещи, я продолжаю работать с циклическим импортом. Вот что у меня есть:
Модель / __ init__p.y
Модель / Database.py
Модель / User.py
Мне еще предстоит увидеть приложение Python в реальном мире, использующее MVC, поэтому мой подход, вероятно, не-Pythonic (и, возможно, не зависит от языка ...) - какие-либо предложения о том, как решить эту проблему?
Спасибо, Саймон






Обычно мы помещаем все в один файл. Это не Java или C++.
Начните с одного файла, пока не получите больше опыта работы с Python. Если ваши файлы не гигантские, все будет нормально.
Например, Django поддерживает этот стиль, поэтому скопируйте их формулу успеха. Один модуль для модели. Модуль для каждого приложения; каждое приложение импортирует общую модель.
Ваша база данных и суперклассы могут быть в вашем файле __init__.py, поскольку они применяются ко всему пакету. Это может уменьшить некоторую округлость.
Я думаю, у вас есть одна проблема, которую следует решить. Циркулярные ссылки часто возникают из-за невозможности разделения проблем. На мой взгляд, модули базы данных и модели не должны много знать друг о друге, вместо этого они работают с API. В этом случае база данных не должна напрямую ссылаться на какие-либо конкретные классы модели, а вместо этого должна обеспечивать функциональность, которая будет необходима классам модели. Модель, в свою очередь, должна получить ссылку на базу данных (введенную или запрошенную), которую она будет использовать для запроса и сохранения.
В вашей спецификации есть несоответствие. Вы говорите, что Database.py необходимо импортировать все классы модели для выполнения ORM, но затем вы говорите, что классу User требуется доступ к базе данных для выполнения запросов.
Думайте об этом как о слоях API. Класс Database предоставляет API (возможно, объектно-ориентированный) для некоторого физического уровня сохраняемости (например, DB-API 2.0). Классы модели, такие как User, используют уровень базы данных для загрузки и сохранения своего состояния. У класса Database.py нет причин импортировать все классы модели, и на самом деле вы этого не захотите, потому что вам придется изменять Database.py каждый раз, когда вы создаете новый класс модели, что является запахом кода. .
Хороший совет. Сохраняйте простоту, пока не приобретете больше опыта.