"Я нарисовал диаграмму зависимостей импорта и планировал агрегировать классы по уровню слоя."
Python должен читать как английский (или любой другой естественный язык).
Импорт - это первоклассное утверждение, которое должно иметь реальное значение. Организация вещей по «уровню слоя» (что бы это ни было) должна быть ясной, значимой и очевидной.
Не превращайте произвольные технические группировки классов в модули, а модули в пакеты.
Сделать модули и пакеты очевидными и логичными, чтобы список импорта был очевидным, простым и логичным.
"Кроме того, я рассматривал некоторые модификации классов, чтобы уменьшить эти зависимости."
Уменьшение зависимости звучит технически и произвольно. Может и не быть, но звучит так. Без реальных примеров невозможно сказать.
Ваша цель - ясность.
Кроме того, модуль и пакет являются автономными единицами повторного использования. (Не классы; класс, но сам по себе обычно не используется повторно.) Ваше дерево зависимостей должно отражать это. Вы нацелены на модули, которые можно аккуратно и аккуратно импортировать в ваше приложение.
Если у вас много тесно связанных модулей (или альтернативных реализаций), тогда пакеты можно использовать, но использовать их экономно. Библиотеки Python относительно плоские; и в этом есть какая-то мудрость.
Редактировать
Односторонняя зависимость между слоями является существенной особенностью. Это больше о правильном дизайне программного обеспечения, чем о Python. Вы должны (1) спроектировать слои, (2) спроектировать так, чтобы между слоями были очень строгие зависимости, а затем (3) реализовать это в Python.
Упаковки не обязательно точно соответствуют вашим слоям. Пакеты физически могут представлять собой плоский список каталогов с зависимостями, выраженными только через операторы import
.