Питонический способ организации модулей и пакетов

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

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

  • itertools.ifilter Vs. фильтр Vs. список понятий
  • Как вы организовываете модули Python?
  • Как изменить имя модуля Python?
  • Перехват вызовов модуля?
  • Почему Python запускает мой модуль, когда я его импортирую, и как его остановить?
  • Для чего __init__.py?
  • Но, в то же время, не кажется правильным бросать тонну кода в один файл и называть его днем. Очевидно, что очень сложное приложение должно содержать более 5 файлов.

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

  • Будет ли настоящий путь.py, пожалуйста, встаньте?
  • Python: доступ к «областям модуля» vars
  • Как установить библиотеку python вручную
  • Как установить в файлы python 3.4 - .whl
  • Для чего полезен __path__?
  • перезагрузить (обновить) файл модуля в интерпретаторе
  • 5 Solutions collect form web for “Питонический способ организации модулей и пакетов”

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

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

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

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

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

     from automobile import Automobile car = Automobile() 

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

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

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

    Как неопределенное руководство: более 1 класс для файла является нормой для python

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

    Python - лучший язык программирования в мире.