Лекция 14. Модули. Структуры(классы) (1152916), страница 2
Текст из файла (страница 2)
«Информатика. Язык Питон»Переопределениеобъектаозначает, что вновь объявленныйобъект«закрывает»ранееопределенныйвмодулеодноименныйобъект.Чтобыполучить доступ к «закрытому»объекту, нужно воспользоватьсясоставным именем: перед именемобъекта поставить имя модуля иточку.10. ПОЛЬЗОВАТЕЛЬСКИЕ СТРУКТУРЫ ДАННЫХ10.1. Данные сложной структуры, класс и объект класса. Класс вPythonДопустим, есть следующая задача:Таблица 9.4.Составить программу для обработки информации о некоторыхобъектах - студентах какого-то факультета.
Каждый объектхарактеризуется совокупностью признаков (полем):ФамилияОценки ОценкиГодимяпопорождения Полотчествофизике математике12345ОценкипоСтипендияинформатике67подзадача для поиска:Для группы Эт1-94 вывести фамилии студентов, имеющих толькоположительные оценки по физике.Очевидно, что если будем решать такую задачу, выделяя на каждоеполе по переменной для 30-ти человек группы, получим крайнегромоздкий и неудобный код.
Можно слегка улучшить код, выделяя под10Воробьева И.А. «Информатика. Язык Питон»каждое поле массив однотипных элементов. Длина массивов будетсоответствовать числу студентов в группе. Но и с семью массивами иметьдело не очень приятно. А, если мы хотим обработать несколько такихтаблиц для разных групп, тогда придется еще вводить отдельный массивпод хранение названий групп.Подобные задачи появились довольно давно, а их разнообразиепросто не может позволить ввести в языке какой-то специальныйуниверсальный тип, описывающий все варианты. Создатели языковпрограммирования поступили иначе, они обеспечили язык такойсинтаксической конструкцией, которая позволяет программистусамостоятельно формировать собственный тип данных структуры любойсложности – пользовательский тип данных (или структурированныйтип данных).Структурированный тип данных (пока назовем его для краткости –ЗАПИСЬ) был создан специально для объединения в единый блок техданных, которые имеют различные типы элементов внутри себя, нологически взаимосвязаны.
Всякая типичная запись базы данных (БД)яркий тому пример: таблицы – ведомости; прайс-листы магазинов; список товаров на складе; каталоги книг и многое другое.Часто встречаются типы записей, имеющие вложенную структуру.Например, в задаче из таблицы 9.4: поле 1-«ФИО» – само может быть записью, состоящей из трех полейсимвольного типа: «Фамилия», «Имя» и «Отчество»; поля 4, 5 и 6, наоборот, можно объединить в тип запись «Оценки»из трех полей целого типа: «Физика», «Математика» и «Информатика». сама же запись «Ведомость» (которая представлена в таблице)вполне может быть элементом более крупной записи «Ведомостифакультета ИТ» и т.д.11Воробьева И.А.
«Информатика. Язык Питон»Язык Python, как и многие другие, вполне допускает описывать типкакого-то элемента в Записи_1 как тип-Запись_2, и т.д. Глубина вложениятеоретически не ограничена.Запись – пользовательский тип, то есть такой тип, который, языкпрограммирования позволяет программисту конструировать на основеимеющихся в языке базовых типов.Языки, которые были созданы до эпохи активного объектноориентированного программирования (ООП), предоставляли чистосинтаксическую конструкцию для объединения полей разных базовыхтипов: Record (в Pascal) или Struct (в C).В эпоху ООП появились понятия «класса» и «объектов класса». Класс– более широкое понятие, так как кроме описания полей в данныхсложной структуры позволяет написать еще и собственные локальныефункции – только над данными такой структуры. Если не вдаватьсясильно в подробности, то на примере задачи из таблицы 9.4. мы можемназвать: объектом нашу ЗАПИСЬ (строку в ведомости); у объекта есть свойства, признаки (это поля ЗАПИСИ) и они описаныв пользовательском типе - классе «ВЕДОМОСТЬ»; над объектом можно совершать действия, например, «ввестиданные в один объект с клавиатуры» или «вывести на экрансодержимое объекта», такие действия называются методамикласса.Чтобы упростить понимание, давайте соотнесем это с известныминам простыми типами данных, например с целым числом.тип – это класстип – это целоеэкземпляр типа – объект классаэкземпляр типа – целая переменнаяметод класса – функция надобъектом (например, функциязаполнения всех полей одногообъекта)метод типа - любая функция надцелым, которую мы напишем сами(например,функция,котораявычисляет куб от целого числа ивыводит его на экран)12Воробьева И.А.
«Информатика. Язык Питон»Так как язык Python изначально создавался, как язык ООП, то в немне предусмотрено никаких устаревших конструкций, а сразу введенопонятие класса. Общий синтаксис определения класса (class) следующий:class имя_класса:В этой специальной функции (это обязательное имя) описываютсяс инициализацией все поля сложной структуры нашего объекта.def __init__(self, <список параметров начальных значений>):<self.поле_1>=<параметр_1>…<self.поле_N>=<параметр_N><методы-функции для этого класса>Как и в случае с описанием функций, в классе может отсутствоватьлюбой элемент, как сами поля, так и методы над полями класса.
Классвообще может быть пустым (если в этом есть смысл):class имя_класса:pass # пустой классМетоды класса имеют одно отличие от обычных функций: они должныиметь дополнительно имя, добавляемое к началу списка параметров.Однако, при вызове метода никакого значения этому параметруприсваивать не нужно, – его укажет Python. Эта переменная указываетна сам объект класса, и по традиции она называется self (self – от англ.сам).Дальнейшее изучение классов удобнее продолжить, рассматриваяконкретную задачу, в которой нужно ввести собственный класс –пользовательский тип данных.13Воробьева И.А. «Информатика. Язык Питон»10.2. Реализация собственного класса с методами ииспользование его для решения задач (на примере задания влабораторной работе 7)Задача. На почте имеетсякоробок, характеризующиеся своимигабаритами( – длина, – высота,– ширина).
Указан форматбумаги () в мм и толщина листа () (толщина листа писчейбумаги изменяется в диапазоне от 0.1 до 0.3 мм).Определить, в какие из коробок (вектор результата ) может бытьупакована бумага указанного формата (предполагается, что более однойстопки в коробку класть нельзя, а бумага укладывается горизонтально).Подсчитать суммарное число () листов, которые можно послать вимеющихся на почте коробках, число () используемых коробок, атакже объем() уплотнителя, который придется уложить в пустотымежду грузом и тарой.Блок-схема (алгоритм) решения задачи представлена на странице 18.Определение класса для объектов типа «box» (коробка) иполезных функций для объектов такого типа.class box:# Определение объекта класса "box" с инициализацией# объект класса содержит три вещественные и одну логическую# переменные:# l – длина, h – высота, w – «толщина» и# f – признак использования коробки# обратите внимание, что возможна инициализация по умолчаниюdef __init__(self, length=1.0, height=1.0, width=0.1, use=0):self.l = length # длинаself.h = height # высота14Воробьева И.А.
«Информатика. Язык Питон»self.w = width # "толщина"if use == 0: # можно обойтись без нее в задаче,# но для класса полезно потенциально иметь эту перем.self.f = False # коробка свободнаelse:self.f = True # коробка используется# Проверка: влезет ли "лист" в коробку в любой из горизонтальныхориентацийdef Check(self, length, height):if (self.l >= length and self.h >= height) or(self.h >= length and self.l >= height):self.f = True # коробка подходит --> используетсяelse:self.f = False # коробка не подходитreturn self.f# Объем коробкиdef Volume(self):return self.l*self.h*self.w# Сколько влезет "листов" определенной толщиныdef Amount(self, width):return self.w/width# Вывод содержимого объекта на экранdef out_box(self):if self.f:print ('свободна', end='-->')else:print ('используется', end='-->')print('L=', self.l, 'H=', self.h, 'W=', self.w)# Ввод габаритов коробки c клавиатурыdef in_box(self):self.l = float(input('L-> '))self.h = float(input('H-> '))15Воробьева И.А.
«Информатика. Язык Питон»self.w = float(input('W-> '))self.out_box()Определение класса «box» и его методов (функций) сохраним вмодуле «cbox.py».Решение задачи при помощи готового класса с методамиразместим в головном модуле под названием«Problem_Post.py» .from cbox import * # подключаем модуль класса "cbox" со всеми# доступными именами теперь к открытым функциям# можно обращаться просто по имени#--------РАЗДЕЛ КОНСТАНТNmax = 10 # максимальное число коробокLA = 297 # формат А4 в мм (строго говоря, это д.б. переменные,HA = 210 # которые вводят с клавиатуры или из файла)WA = 0.1 # толщина листа#--------РАЗДЕЛ ПЕРЕМЕННЫХSh = box(LA, HA, WA) # создадим один объект box для листа бумагиA = [box() for i in range(Nmax)] # !!!! создаем массив из отдельных# объектов# со значениями по умолчаниюn = 0 # число объектовSumA = 0 # сумманое число листов в коробкахKolA = 0 # число подходящих (использованных) коробокNums = [0]*Nmax # массив с номерами подходящих коробокVol = 0.0 # суммарный объем коробокVolU = 0.0 # объем уплотнителя в коробкахi = 0 # индекс#--------РАЗДЕЛ ОПЕРАТОРОВ16Воробьева И.А.