Организация моего проекта Python - PullRequest
44 голосов
/ 24 декабря 2008

Я запускаю проект Python и ожидаю, что в нем будет 20 или более классов. Как хорошая практика, я хочу поместить их в отдельный файл каждый. Тем не менее, каталог проекта быстро становится завален файлами (или будет, когда я это сделаю).

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

Заранее спасибо

Ответы [ 4 ]

31 голосов
/ 24 декабря 2008

Создайте файл __init__.py в папке ваших проектов, и он будет рассматриваться как модуль Python.

Классы в вашем каталоге пакетов могут быть импортированы с использованием следующего синтаксиса:

from package import class
import package.class

В пределах __init__.py вы можете создать массив __all__, который определяет поведение from package import *:

# name1 and name2 will be available in calling module's namespace 
# when using "from package import *" syntax
__all__ = ['name1', 'name2'] 

А вот намного больше информации, чем вы хотите знать о пакетах в Python

Вообще говоря, хороший способ узнать, как организовать большое количество кода, - это выбрать популярный пакет Python и посмотреть, как он это сделал. Я бы проверил Django и Twisted , для начала.

22 голосов
/ 24 декабря 2008

«В соответствии с хорошей практикой я хочу поместить их в отдельный файл».

Это на самом деле не очень хорошая практика. Вы должны разрабатывать модули, которые содержат тесно связанные классы.

На практике ни один класс на самом деле не стоит в одиночестве. Обычно классы объединяются в группы или группы, которые логически связаны между собой.

12 голосов
/ 24 декабря 2008

Python не навязывает вам отвратительный стиль Java «один класс на файл». На самом деле, даже не считается хорошим стилем помещать каждый класс в отдельный файл, если он не огромен. (Если они огромные, вам, вероятно, все равно придется выполнить рефакторинг.) Вместо этого вы должны сгруппировать похожие классы и функции в модули. Например, если вы пишете графический калькулятор, макет вашего пакета может выглядеть следующим образом:

/amazingcalc
   /__init__.py # This makes it a Python package and importable.
   /evaluate.py # Contains the code to actually do calculations.
   /main.py # Starts the application
   /ui.py # Contains the code to make a pretty interface
6 голосов
/ 24 декабря 2008
Простой ответ

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

import mynewsubfolder.mynewclass
...