Определение классов в пакетах

Я изучаю Python, и я играю с пакетами. Я хотел знать, как лучше определить классы в пакетах. Кажется, что единственный способ определить классы в пакете - определить их в __init__.py этого пакета. Исходя из Java, я хотел бы определить отдельные файлы для своих классов. Является ли это рекомендуемой практикой?

Я хотел бы, чтобы мой каталог выглядел примерно так:

recursor/
    __init__.py
    RecursionException.py
    RecursionResult.py
    Recursor.py

Поэтому я мог бы ссылаться на мои классы как recursor.Recursor, recursor.RecursionException и recursor.RecursionResult. Является ли это выполнимым или рекомендуется в Python?

Ответ 1

Идем дальше и определяем ваши классы в отдельных модулях. Затем сделайте __init__.py сделать что-то вроде этого:

from RecursionException import RecursionException
from RecursionResult import RecursionResult
from Recursor import Recursor

Это будет импортировать каждый класс в пространство имен корневых пакетов, поэтому код вызова может ссылаться на recursor.Recursor вместо recursor.Recursor.Recursor.

Я чувствую необходимость повторять некоторые из других комментариев здесь: Python - это не Java. Вместо того, чтобы создавать новый модуль для каждого класса под солнцем, я предлагаю группировать тесно связанные классы в один модуль. Это проще понять ваш код таким образом, и для вызова кода не потребуется импорт в bazillion.

Ответ 2

Это прекрасно выполнимо. Просто создайте новый класс для каждого из этих классов и создайте именно ту структуру, которую вы разместили.

Вы также можете создать модуль Recursion.py или что-то подобное и включить все 3 класса в этот файл.

(Я также новичок в Python с Java, и я еще ничего не добавил в свои файлы __init__.py)

Ответ 3

В Python вы не ограничены определением 1 класса для каждого файла, и немногие делают это. Вы можете, если хотите, хотя - это полностью зависит от вас. Пакет в Python - это просто каталог с

__init__.py 

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