Как разделить программу на модули питон

В этой статье вы научитесь разбивать вашу программу на компактные и элегантные модули — пакеты. Также вы узнаете как импортировать собственные и сторонние пакеты в ваши проекты.

Что такое пакеты

Никто из нас не хранит все файлы на компьютере в одном месте. У каждого из нас хорошо организованная иерархия папок — так проще найти нужный файл.

Файлы одного и того же типа хранятся в одной папке. Например, песни мы храним в папке «музыка». То же самое и в Python — для разных фрагментов кода свои директории и модули.

С ростом количества строк кода в проекте растет и количество модулей. Одни модули мы храним в одном пакете, другие — в другом. Так проектом проще управлять, он становится понятнее.

Как папки содержат подпапки, так и пакеты Python содержит подпакеты и модули.

Чтобы Python воспринимал папку как пакет, в ней должен содержаться файл __init__.py . Он может быть пустым, но обычно в нем содержится инициализационный код этого пакета.

Приведем пример — допустим, вы разрабатываете игру. На картинке представлен возможный вариант организации пакетов и модулей.

Разбиваем проект на файлы

Импорт модулей из пакета

Как разбить проект на модули?

Все имена вымышленные, но отражают смысл всей этой задачи. Так вот. В файле api.py есть класс settings который обновляется по команде пользователя:

class settings: def update(self, sql): self.settings = sql.get_settings_from_db() settings = settings() settings.update(sql)

Понятно, файл api.py однажды импортирован в main.py и в нём инициализированы все необходимые переменные, в нашем случае settings.

Теперь, если добавить ещё пару классов, которые используют данные из класса settings, то получится что-то такое:

class settings: def update(self, sql): self.settings = sql.get_settings_from_db class users: def say_id(self): print(settings.settings.id) class posts: def do(self): print(settings.settings.posts) #code here settings = settings()

А теперь, чтобы код стал красивым разобьём всю эту красоту по файлам:
api.py

from classes.users import users from classes.posts import posts class settings: def update(self, sql): self.settings = sql.get_settings_from_db settings = settings() users = users() posts = posts() users.say_id()
class users: def say_id(self): print(settings.settings.id)
class posts: def do(self): print(settings.settings.posts) #code here

При запуске api.py начинаются проблемы (и самое интересное): класс users не видит инициализированную переменную settings в api.py, значит у нас есть тривиальные пути:
1. Передать settings с вызовом функции:
users.say_id(settings)
Весьма просто и, по-моему мнению, не лучший вариант
2. Из файла users.py сделать импорт родительского модуля: import __main__ и потом уже __main__.settings().update()
Но так как settings.update() занимает ресурсы: подключается к бд и тянет инфу, и если вызовов users.say_id несколько тысяч в секунду, то сами понимаете, 1000 раз в секунду обновлять настройки, которые могут не меняться месяцами (глупо).

Импорт собственных модулей в Python. Import modules. Атрибут модуля __name__ и __main__

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

  • Вопрос задан более трёх лет назад
  • 2646 просмотров
Читайте также:
Какая самая сильная шахматная программа в мире

Источник: qna.habr.com

Модули. Общие сведения. Создание модуля. Инструкции import , from

При написании больших программ или при увеличении размера программы все больше становится потребность в правильном (корректном) разбиении программы на структурно-независимые части. Целью такого структурирования является:

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

Для обеспечения структурирования в языке Python используются так называемые модули. Модуль – это программная единица, содержащая программный код и данные и предназначенная для организации взаимодействия между структурно-независимыми (структурно-уникальными) частями программы. Каждому модулю соответствует соответствующий файл программы. И, наоборот, каждый файл – это отдельный модуль.

Любой отдельный модуль может быть импортирован (подключен, использован) другим модулем. Также модуль может импортировать (использовать) другой модуль.

Компоненты, реализуемые в модуле, называются атрибутами. Компоненты – это имена переменных связанных с функциями, объектами, классами и т.д.

Также возникает понятие импорт модуля. Импорт модуля – это подключение модуля с помощью специальных инструкций с целью получения доступа к программным средствам (инструментам) этого модуля. После импорта становятся доступными для использования атрибуты модуля.

2. Необходимость использования модулей

Использование модулей позволяет структурировать программные компоненты в автономные пакеты, которые называются пространствами имен. Как в любом пространстве имен при импорте модуля, все имена являются атрибутами объекта импортируемого модуля. Эти имена описываются в глобальной области видимости импортируемого модуля.

Использование модулей важно по следующим причинам:

  • повторное использование кода. Каждый модуль представлен в виде файла. Это позволяет подключать его код в разных (нескольких) клиентских частях программы. В модуле формируется набор имен или, другими словами, набор атрибутов этого модуля;
  • распределение пространств имен. Модули являются естественным методом группировки компонент программной системы. С помощью модулей имена изолируются, что позволяет избежать конфликта и путаницы в именах. Имена, используемые в модулях, сгруппированы по некоторым критериям. Объекты и программный код неявно включены в модули;
  • совместное использование программных компонентов и данных. Здесь имеется в виду, что один и тот же модуль может использоваться в различных компонентах программной системы. Модуль только один – клиентских программных компонентов несколько.
3. Организация приложений на языке Python. Главный файл программы при модульном построении. Второстепенные файлы

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

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

Если главный файл не будет импортирован в другие файлы, его расширение может быть любым (не обязательно расширение *.py). Важно, чтобы это расширение имело все остальные модули, подключаемые в этом файле. В любом случае, рекомендуется задавать расширение главного файла как *.py, так как это расширение делает назначение данного файла более очевидным и в дальнейшем позволит его импортировать в другие файлы.

Читайте также:
Программа для разделения звука на компьютер и телевизор

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

4. Пример организации программы, состоящей из трех файлов. Рисунок

На рисунке 1 изображен пример организации программы, состоящей из трех файлов:

  • main.py – главный файл программы. Из окна редактора этого файла производится запуск программы и подключение второстепенных модулей;
  • figures.py , strings.py – второстепенные файлы программы, импортируемые в файл main.py . Файл figures.py содержит функции определения характеристик известных фигур. Файл strings.py содержит функции обработки строк. Эти файлы не запускаются как второстепенные программы.

Python. Схема подключения дополнительных модулей и их использование

Рисунок 1. Схема подключения дополнительных модулей и их использование

Как видно из рисунка 1, в модуле figures.py объявляются функции Circumference() , AreaCircle() , VolumeSphere() . Также в модуле strings.py объявляются функции ReverseString() и GetCharCount() . Для доступа к функциям модулей figures.py и strings.py в модуле main.py происходит следующее подключение

import figures, strings

После этого можно обращаться к функциям модулей с помощью синтаксиса

figures.Circumference() figures.AreaCircle() figures.VolumeSphere() strings.ReverseString() strings.GetCharCount()

В свою очередь в модуле figures.py подключаются файлы стандартной библиотеки math

import math

которая содержит математические функции и константы. Модуль figures.py использует константу

math.pi

которая возвращает число π = 3.1415… .

Архитектуру программы, изображенной на рисунке 1, можно представить следующим образом (рисунок 2).

Python. Архитектура программы, содержащей 3 файла

Рисунок 2. Архитектура программы, содержащей 3 файла

5. Создание модуля средствами Python

В классическом Python модуль создается вызовом стандартной команды создания файла с расширением *.py . Одним из возможных вызовов есть:

File -> New File

или комбинация клавиш Ctrl+N как показано на рисунке 3.

Python. Команда создания нового модуля

Рисунок 3. Создание нового модуля в Python 3.0

В результате будет создан файл с именем Untitled.py , который в дальнейшем следует сохранить на постоянный носитель (жесткий диск или другой носитель) с одновременным указанием его имени. Это имя будет идентифицировать модуль в других модулях, которые его будут использовать.

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

6. Способы подключения содержимого других модулей

Подключение модуля (файла с расширением *.py ) производится с помощью следующих инструкций:

  • import – здесь подключается весь модуль;
  • from – здесь подключается отдельный компонент модуля;
  • from* – здесь подключаются все имена заданного модуля.

Ниже более подробно рассматриваются все три способа.

7. Доступ ко всему модулю. Инструкция import

Чтобы получить доступ к другому модулю полностью, используется инструкция import , вызов которой имеет вид:

import ModuleName

  • ModuleName – имя подключаемого модуля. Это файл с расширением *.py . В этом случае подключается файл ModuleName.py . В файле описывается программный код с данными, которые необходимо использовать в текущем модуле. Имя файла ModuleName.py заменяется на имя переменной ModuleName . Соответствующие компоненты (составляющие) этого файла являются атрибутами переменной ModuleName .

После подключения директивой import обращение к элементу из этого модуля выглядит примерно так

Читайте также:
Программа которая меняет адрес компьютера

ModuleName.ItemName

  • ItemName – имя элемента из модуля ModuleName . Элементом может быть, например, имя функции, глобальная переменная, имя класса и т.п.

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

Пример.

Пусть в редакторе Python были созданы два модуля с именами module01.py и module02.py . Эти модули размещаются в одной и той же папке (каталоге).

В модуле module02.py реализована функция определения характеристик известных геометрических фигур:

  • Circumference() – длины круга;
  • AreaCircle() – площади круга;
  • VolumeSphere() – объем шара.

Текст модуля module02.py

# Модуль module02.py # Здесь объявлены функции вычисления характеристик известных фигур. # Подключить модуль math для того, чтобы использовать # константу math.pi и функцию math.pow() import math # Функция вычисления длины окружности def Circumference(r): return 2*math.pi*r # Функция вычисления площади круга def AreaCircle(r): return path.pi*r*r # Функция вычисления объема шара def VolumeSphere(r): return 4.0/3.0 * math.pi*r*r*r

Чтобы использовать эти функции в модуле module01.py , нужно подключить module02.py с помощью инструкции

import module02.py

Демонстрационный текст модуля module01.py следующий

# Модуль module01.py # Подключить модуль module02.py import module02 # Использование функций модуля module02.py # 1. Вычислить длину окружности print(«Circumference(2.0) color: #ff0000;»># 2. Вычислить площадь круга print(«AreaCircle(2.0) color: #ff0000;»># 3. Вычислить объем шара print(«VolumeSphere(2.0) color: #0000ff;»>module01.py программа отобразит следующий результат

Circumference(2.0) = 12.566370614359172 AreaCircle(2.0) = 12.566370614359172 VolumeSphere(2.0) = 33.510321638291124

8. Доступ отдельным компонентам модуля. Инструкция from-import

В Python есть возможность получить упрощенный доступ к элементам модуля с помощью инструкции from-import . В общем случае использование данной инструкции следующее:

from ModuleName import ItemName

  • ModuleName – имя модуля, к элементам которого нужно получить доступ;
  • ItemName – имя элемента модуля. Элементом модуля могут быть класс, функция, глобальная константа и т.д.

После такого подключения можно обращаться к элементу ItemName без указания имени ModuleName и символа ‘ . ‘ (точка).

Пример.

Чтобы получить сокращенный доступ к функции sin() из библиотеки math , нужно использовать следующую инструкцию

from math import sin

После этого можно вызвать функцию sin() без указания имени модуля math

y = sin(0.5) # получить синус от 0.5 радиан

9. Доступ к именам модуля. Инструкция from*

Инструкция from имеет специальную форму from* . Эта форма позволяет копировать имена модуля в текущий модуль так, что имя этого модуля не нужно использовать при обращении к его компоненту.

Это позволяет сократить ввод с клавиатуры и повысить читабельность программы.

Пример.

В примере импортируются имена из модуля random. Этот модуль содержит функции генерирования случайных чисел. В целях демонстрации вызывается функция randrange() , которая генерирует целое число в заданном интервале. На основе вызова randrange() формируется список из 10 целых чисел.

# Импортировать все компоненты из модуля random from random import * # Сформировать список случайных целых чисел, # каждое из которых лежит в диапазоне [0; 20] # 1. Сформировать пустой список L = [] # 2. Цикл формирования списка L i = 1 while i⇑

Связанные темы

Источник: www.bestprog.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru