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