Определить классы в пакетах - PullRequest
11 голосов
/ 11 июня 2010

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 11 июня 2010

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

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

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

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

2 голосов
/ 11 июня 2010

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

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

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

1 голос
/ 11 июня 2010

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

__init__.py 

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

...