Программирование аркадных игр и обучение информатике

Программирование аркадных игр
и обучение информатике

Chapter 14: Библиотеки и модули

Библиотека - это собрание кода функций и классов. Зачастую, библиотеки пишутся кем-то другим и добавляются в проект для того, чтобы программисту не пришлось заново “изобретать колесо”. В Python термином, используемым для описания библиотеки с кодом, является модуль(module).

Созданные до этого программы уже применяли модули за счёт использования import pygame и import random. Можно также сделать библиотеку, состоящую из нескольких импортируемых модулей. Зачастую библиотека содержит только один модуль, так что иногда эти термины могут быть взаимозаменяемыми.

Модули зачастую сгруппированы по функциональности. В этом классе программы уже использовали функции модуля math, модуля random и библиотеки pygame. Модули могут быть организованы так, что отдельные модули будут содержать в себе другие модули. Например модуль pygame содержит подмодули pygame.draw, pygame.image и pygame.mouse.

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

14.1 Зачем делать библиотеку?

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

  1. Это разбивает код в меньшие части, более простые для использования.
  2. Это позволяет нескольким людям работать над программой в одно и то же время.
  3. Написанным кодом легко можно поделиться с другими программистами.

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

Если несколько программистов работают над одним проектом, практически невозможно писать весь код в одном файле. Но, разбив программу на несколько частей, процесс упрощается. Один программист мог бы разрабатывать класс спрайта "Orc". Другой программист мог бы работать над классом спрайта "Goblin". Потому, что каждый спрайт описан в своём файле, у программистов не возникнет конфликтов.

Современные программисты редко пишут программы с нуля. Зачастую программы строятся на частях других программ, разделяющих подобную функциональность. Если один программист создаёт код, способный обрабатывать бланк по оплате ипотечного кредита, то, в идеальном случае, этот код пойдёт в отдельную библиотеку. Затем, если в какой-то другой программе потребуется обрабатывать ипотечный кредит, он просто сможет использовать уже готовую библиотеку.

14.2 Создание своего файла модуля/библиотеки:

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

# Foo function
def foo():
    print ("foo!")
    
# Foo call
foo()

Да, эта программа не слишком длинная для одного файла. Но если бы функция и главная часть программы были бы длинными, всё было бы иначе. Особенно если бы в файле присутствовало несколько функций. Для этого примера, мы оставим код коротким ради ясности.

Мы можем переместить функцию foo в другой файл. Затем в этом файл будет оставлен только главный код программы. (Напомню, что в этом примере для этого нету никакого смысла, кроме того, чтобы научиться, как это делать)

Для этого, создайте новый файл и скопируйте в него функцию foo. Сохраните новый файл, дав ему имя my_functions.py.

# Foo function
def foo():
    print ("foo!")
# Вызов Foo не будет работать
foo()

К сожалению, не всё так просто. Test.py не знает, что нужно найти файл my_functions.py, а затем импортировать его. Нам самим нужно будет это сделать:

# Импортировать файл my_functions.py
import my_functions

# Вызов Foo всё ещё не будет работать
foo()

Это всё ещё не работает. Чего же нам не хватает? Также, как в случае с pygame, нам нужно добавить имя модуля перед функций. Как это сделано здесь:

# Импортировать файл my_functions.py
import my_functions

# Вызов Foo, который работает
my_functions.foo()

Это работает потому, что my_functions. добавлено перед вызовом функции.

14.3 Пространство имён:

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

def print_report():
    print ("Student Grade Report:" )
def print_report():
    print ("Financial Report:" )

Как мы можем сказать программе, какую функцию вызывать? Это достаточно просто. Вы задаёте “пространство имён.” Пространство имён - это слово, появляющееся перед именем функции в нижеприведённом коде:

import student_functions
import financial_functions

student_functions.print_report()
financial_functions.print_report()

И так, теперь мы можем видеть, зачем это нужно. Но что, если у вас нету конфликтов с именами? Писать имя модуля каждый раз может быть утомительным. Это легко обойти, импортируя библиотеку в “локальное пространство имён.” Локальное пространство имён - список функций, переменных и классов, перед которыми не нужно писать название модуля. Возвращаясь к примеру с foo, уберём начальный import и замением его новым типом импорта:

# import foo
from my_functions import *

foo()

Это будет работать даже без написания my_functions. перед вызовом функции. Звёздочка обозначает шаблон для импорта всех функций из my_functions. При желании программист может импортировать индивидуальные функции, указывая их имена.

14.4 Библиотеки третьих лиц

При работе с Python, возможно использовать множество библиотек, встроенных в Python. Посмотрите на список библиотек, приведённый здесь:
http://docs.python.org/modindex.html

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

14.5 Проверка пройденного

Попробуйте заполнить этот бланк по классам, библиотекам, модулям (на англ. яз.):
Chapter 15 Worksheet.docx

  1. Что такое Python библиотека? Что такое Python модуль?
  2. Какие могут быть причины для создания собственного файла библиотеки?
  3. Существует два вида импортирования файлов библиотеки в Python.
    • Дайте пример каждого из них.
    • Как вызовы функций и классов отличаются в зависимости от импорта библиотеки?
  4. Могут ли файлы библиотек импортировать другие файлы библиотек?
  5. Сначала, попробуйте написать код на бумаге. Затем, напечатайте его.
    • Создайте класс Monster() с аттрибутами "type"(тип) и "hit points"(очки здоровья). Создайте метод print(), выводящий тип монстра и оставшиеся очки здоровья.
    • Создайте дочерние классы Orc() и Goblin(). Создайте __init__, присваивающий переменной type значение “Orc” или “Goblin”. Также, поставьте значение hit points на случайное число от 5 до 10 для гоблина и от 15 до 30 для орка.
    • Создайте список монстров и добавьте в него пару орков и несколько гоблинов. Затем, вызовите метод print() для каждого элемента в списке.
  6. Возьмите программу из предыдущей лабораторной работы. Сделайте копию. Вынесите классы и функции в отдельный файл.

    You are not logged in. Log in here and track your progress.