Вопрос

Я пришел из фона, где я обычно создаю один файл на класс. Я также организую общие классы по каталогам. Эта практика для меня интуитивно понятна и доказала свою эффективность в C ++, PHP, JavaSript и т. Д.

У меня проблемы с переносом этой метафоры в Python: файлы больше не просто файлы, а формальные модули. Кажется неправильным просто иметь один класс в модуле - большинство классов сами по себе бесполезны. Если у меня есть класс automotive.py и класс Automobile , кажется глупым всегда также ссылаться на него как automotive.Automobile .

Но в то же время кажется неправильным бросать тонну кода в один файл и называть это днем. Очевидно, что очень сложное приложение должно иметь более 5 файлов.

Каков правильный или питонический способ? (Или, если нет правильного пути, какой путь вы предпочитаете и почему?) Сколько кода я должен добавить в модуль Python?

Это было полезно?

Решение

Думайте в терминах «логической единицы упаковки» - это может быть один класс, но чаще будет набор классов, которые тесно взаимодействуют. Классы (или функции уровня модуля - не «делайте Java в Python», всегда используя статические методы, когда функции уровня модуля также доступны как выбор! -) могут быть сгруппированы на основе этого критерия. По сути, если большинству пользователей A также требуется B и наоборот, A и B, вероятно, должны находиться в одном модуле; но если многим пользователям потребуется только один из них, а не другой, то они, вероятно, должны быть в разных модулях (возможно, в одном пакете, т. е. в каталоге с файлом __ init __. py ).

Стандартная библиотека Python, хотя и далека от совершенства, имеет тенденцию отражать (в основном) достаточно хорошие практики - так что вы можете в основном учиться на ней на примере. Например, модуль threading , конечно, определяет класс Thread ... но он также содержит классы синхронизации, такие как блокировки, события, условия и семафоры, и класс исключений, который может быть вызван поточными операциями (и еще несколькими вещами). Он находится на верхней границе разумного размера (800 строк, включая пробелы и строки документации), и некоторые важные функции, связанные с потоками, такие как очередь, были помещены в отдельный модуль, тем не менее это хороший пример того, какой максимальный объем функций по-прежнему имеет смысл упаковать в один модуль.

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

Если вы хотите придерживаться своей системы «один класс на файл» (что логично, не поймите меня неправильно), вы можете сделать что-то подобное, чтобы не ссылаться на automotive.Automobile :

from automobile import Automobile
car = Automobile()

Однако, как упоминает cobbal, в Python довольно распространено более одного класса на файл. В любом случае, пока вы выбираете разумную систему и используете ее последовательно, я не думаю, что пользователи Python будут злиться на вас:).

Если вы исходите из точки зрения c ++, вы можете просматривать модули python, схожие с .so или .dll. Да, они выглядят как исходные файлы, потому что Python написан на скрипте, но на самом деле это загружаемые библиотеки с определенной функциональностью.

Еще одна метафора, которая может вам помочь, это то, что вы можете рассматривать модули python как пространства имен.

В проекте среднего размера я обнаружил несколько наборов тесно связанных классов. Некоторые из этих наборов теперь сгруппированы в файлы; например, все низкоуровневые сетевые классы находятся в одном модуле network . Тем не менее, некоторые из самых больших классов были разделены на свои собственные файлы.

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

В качестве расплывчатого указания: более 1 класса на файл является нормой для python

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top