Python: один модуль (файл .py) для каждого класса?

Я начал программировать на python 2 недели назад. Я делаю отдельный файл (модуль) для каждого класса, как я это делал раньше, в таких языках, как Java или С#. Но теперь, видя учебники и код других людей, я понял, что многие люди используют одни и те же файлы для определения более 1 класса и основной функции, но я не знаю, делают ли они это так, потому что это просто примеры или потому, что это соглашение python или что-то в этом роде (для определения и группировки многих классов в одних и тех же файлах).

Итак, в Python один файл для каждого класса или много классов в тех же файлах, если они могут быть сгруппированы по какой-либо конкретной функции? (например, автомобили с одной стороны и только транспортные средства с другой стороны).

Очевидно, что каждый из них имеет свой стиль, но когда я спрашиваю, я надеюсь, что общие ответы или просто соглашения, во всяком случае, если кто-то хочет рассказать мне свое мнение о своем стиле и почему, не стесняйтесь это делать!;)

Ответ 1

один файл для каждого класса

Не делай этого. В Java вы не можете - по дизайну - иметь более одного класса в файле.

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

А почему? Короче: читаемость. Мне лично не нравится переключаться между файлами, чтобы читать связанные или похожие коды. Это также делает импорт более кратким.

Представьте socketserver.py будет распространяться UDPServer, TCPServer, ForkingUDPServer, ForkingTCPServer, ThreadingUDPServer, ThreadingTCPServer, BaseRequestHandler, StreamRequestHandler, DatagramRequestHandler в девять файлов. Как бы вы их импортировали? Как это?

from socketserver.tcp.server import TCPServer
from socketserver.tcp.server.forking import ForkingTCPServer
...

Это простые накладные расходы. Это накладные расходы, когда вы его пишете. Это накладные расходы, когда вы читаете это. Разве это не так проще?

from socketserver import TCPServer, ForkingTCPServer

Тем не менее, никто не остановит вас, если вы поместите каждый класс в один файл. Это может быть не pythonic.

Ответ 2

Python имеет концепцию пакетов, модулей и классов. Если вы поместите один класс на модуль, преимущество наличия модулей ушло. Если у вас огромный класс, вполне возможно, что этот класс будет помещен в отдельный файл, но опять же, хорошо ли иметь большие классы? НЕТ, трудно тестировать и поддерживать. Лучше иметь более маленькие классы с конкретными задачами и поместить их логически сгруппированными в максимально возможное количество файлов.

Ответ 3

Неправильно иметь один класс для каждого файла. Python напрямую не нацелен на объектно-ориентированный дизайн, поэтому вы можете уйти с несколькими классами на файл.

Я рекомендую прочитать некоторые руководства по стилю, если вы смущены тем, что "правильный" способ сделать это.

Я предлагаю руководство по стилю Google или официальное руководство по стилю Python Foundation

Вы также можете найти больше материалов, относящихся к идиомам и метаанализу Python, в PEP index