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

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

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

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

11
Naftuli Kay 11 Июн 2010 в 20:28

3 ответа

Лучший ответ

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

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

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

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

9
ʇsәɹoɈ 11 Июн 2010 в 18:59

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

__init__.py 

Файл. Вам не нужно ничего помещать в этот файл, вы можете контролировать, что импортируется и т. Д.

1
Khorkrak 11 Июн 2010 в 16:31

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

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

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

2
froadie 11 Июн 2010 в 16:30