Подтвердить что ты не робот

Рекомендуются ли несколько классов в одном файле?

Возможный дубликат:
Сколько классов Python нужно поместить в один файл?

Исходя из фона С++, я привык к организации моих классов таким образом, что, по большей части, соотношение 1:1 между классами и файлами. Сделав это так, чтобы один файл содержал один класс, я нахожу код более доступным для навигации. Когда я представляю себя Python, я нахожу множество примеров, когда один файл содержит несколько классов. Это рекомендуемый способ делать вещи на Python? Если да, то почему?

Я пропустил это соглашение в PEP8?

4b9b3361

Ответ 1

Вот несколько возможных причин:

  • Python не является исключительно основанным на классе - естественным элементом декомпозиции кода в Python является модуль. Модули также могут содержать функции (которые являются первоклассными объектами в Python) в качестве классов. В Java единицей разложения является класс. Следовательно, Python имеет один модуль = один файл, а Java имеет один (общедоступный) класс = один файл.
  • Python гораздо более выразителен, чем Java, и если вы ограничиваете себя одним классом для каждого файла (который Python не мешает вам делать), у вас будет множество очень маленьких файлов - больше для отслеживания с очень маленькими выгода.

Пример примерно эквивалентной функциональности: Java log4j = > несколько десятков файлов, ~ 8000 SLOC. Python logging = > 3 файла, ~ 2800 SLOC.

Ответ 2

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

Хорошо поток из списка рассылки Python и цитата Фредрика Лунда:

Еще важнее то, что в Python, вы не используете классы для каждого, вещь; если вам нужны фабрики, одиночные игры, несколько способов создания объекты, полиморфные помощники и т.д., вы используйте простые функции, а не классы или статические методы.

после того, как вы закончите "все" классы ", использовать модули для организации вещей, которые имеют смысл код, который использует ваши компоненты.
сделать заявления импорта хорошо выглядеть.

Ответ 3

В python класс также может использоваться для небольших задач (только для группировки и т.д.). поддержание отношения 1:1 приведет к тому, что будет слишком много файлов с небольшой или небольшой функциональностью.

Ответ 4

Для этого нет конкретного соглашения - сделайте все, чтобы ваш код был наиболее читаемым и поддерживаемым.

Ответ 5

книга Expert Python Programming имеет что-то связанное обсуждение
Глава 4: Выбор хороших имен: "Создание дерева пространства имен" и "Разделение кода"
Объяснение моей строки: собрать некоторый связанный класс с одним модулем (исходный файл) и собрать некоторый связанный модуль к одному пакету, полезно для поддержания кода.

Ответ 6

Хорошим примером отсутствия отдельных файлов для каждого класса может быть файл models.py в приложении django. В каждом приложении django может быть несколько классов, связанных с этим приложением, и их размещение в отдельных файлах просто делает больше работы.

Аналогично, просмотр каждого представления в другом файле снова может быть контрпродуктивным.