Главная » Просмотр файлов » Лутц М. - Изучаем Python

Лутц М. - Изучаем Python (1077325), страница 137

Файл №1077325 Лутц М. - Изучаем Python (Лутц М. - Изучаем Python) 137 страницаЛутц М. - Изучаем Python (1077325) страница 1372018-01-10СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 137)

Конструктор налагает некоторые ограничения целостности, требуя значения для двух атрибутов — пззе и ) 00. Мы могли бы продолжить расширение этой реализации, добавляя методы для вычисления зарплаты, разбора имен и т. д. (как это делается, описывается в примере в конце главы 24). В конечном итоге мы могли бы связать класс в иерархию, чтобы обеспечить наследование набора существующих методов через процедуру автоматического поиска атрибутов классов, и даже записывать экземпляры класса в файл, чтобы б41 ООП и наследование: взаимосвязи типа «является» обеспечить их постоянное хранение (подробнее о сохранении объектов рассказывается во врезке «Придется держать в уме: классы и их хранение», ниже в этой книге).

Наконец, несмотря на всю гибкость таких типов, как словари, классы позволяют наделять объекты поведением таким способом, который встроенными типами и простыми функциями напрямую не поддерживается. ООП и наследование: взаимосвязи типа ссявляется» Мы уже достаточно подробно исследовали механизм наследования, но мне хотелось бы показать пример того, как может использоваться модель отношений реального мира. С точки зрения программиста, наследование вступает в игру с момента появления составного имени атрибута, при разрешении которого запускается поиск имен в экземплярах, в их классах и затем в суперклассах. С точки зрения проектировщика, наследование — это способ указать принадлежность к некоторому набору: класс определяет набор свойств, которые могут быть унаследованы и адаптированы более специализированными наборами (то есть подклассами).

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

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

Существует два типа служащих и, соответственно, два подкласса, наследующих класс Еар1оуее: Све1' (повар) и Ъе грег (официант). Оба подкласса переопределяют унаследованный метод ногК, чтобы обеспечить вывод более специализированных сообщений. Наконец, наш робот по приготовлению пиццы моделируется еще более специализированным классом Р1згайоЬот, наследующим класс Слег, который в свою очередь наследует класс Езр1оуее. В терминах ООП мы называем такие взаимоотношения «является»: робот является поваром, а повар — служащим.

Ниже приводится содержимое файла елтр1оуееа.уу: с1азв Е»Р1оуее; Сет !пзт (яе1Г, лазе, ва1агу=О); 642 ве1(.паве = паве ве1(.ва1агу = ва1агу Оег дсчейасве(веы, регсепс): ве1(.ва1агу = ве1(,ва1агу + (ве1(.ва1агу * регсепС) оет иогк(веи ): ргспС ве1(,паие, "боев втчтт" Оет герт (зе!т): гесчгп "<ещр1оуее; паев=%в, ва1агу=%в>" % (ве1(.паве, ве1(.ва1агу) с1авв Спет(Еир1оуее): Оет 1п1С (ве!т, паве). Ещр1оуее. 1псс (ве1(, паие, 50000) Оет иогК(вест): рг1пс ве1(.паве, "аакев тоос" с1авв Зегчег(Ещр1оуее): Оет 1п1С (вест, паве). Ещр1оуее. сп(П (ве1т, паве, 40000) Оет иогК(ве1(): рг1пс ве1(.паве, "1псегтасез и(СП счвСощег" с1авв Рсааайоэот(СПет); Оет спут (ве1(, паве): Спет.

сп1С (ве1Г. паэе) Оет иогК(ве1(); рг1пт ве1т.паие, "щакев рыла" Е Создать робота о ииенеи Ьоэ Е Вызвать унаследованный иетод герт е Выполнить действие, зависящее от типа Е Уееличить роботу зарплату на 20% тот К1авв сп Еир1оуее, СПет, Еегчег, РсгсайоЬот: оЬ) = К!авв(К!авв. паве ) оь).иогК() Когда выполняется программный код самопроверки, включенный в состав модуля, создается робот по приготовлению пиццы с именем Ьор, который наследует атрибуты трех классов: РсааайоЬЬС, СПе( и Евр1оуее. Например, при попытке вывести экземпляр Ьоэ вызывается метод Ещр1оуее.

герт, а прибавка роботу зарплаты производится методом Ещр1оуее. 01чейасве, потому что этот метод обнаруживается в процессе поиска в дереве наследования именно в этом классе: С; срутпоп'сехащр!ев> руСПоп ещр1оуеев. Ру <Ещр1оуее: паще=ЬоЬ, ва1агу=50000> ЬоЬ иаКев р1ааа <Еар1оуее: паще=ЬоЬ, ва1агу=60000.0> ещр1оуее поев в(от( Спет иаКев тоос Еегчег 1псегтасез и!сп созсощег Р1ыайоэот яаКев р1сса 1( паве == " иасп ЬоЬ = Р1таайоЬос('Ьоэ') ргспс ЬоЬ ЬоЬ.иогк() Ьоэ.дсчейа1ве(0.20) рг1пт ЬоЬ; ргспт Глава 25. Шаблоны проектирования с классами 643 ООП и композиция: взаимосвязи типа «имеет» В иерархиях классов, подобных этой, обычно можно создавать экземпляры любого класса, а не только того, что находится в самом низу.

Например, в коде самопроверки этого модуля в цикле го г создаются экземпляры всех четырех классов, каждый из которых работает по-разному, потому что все онн имеют различные методы иогК. В действительности эти классы пока лишь имитируют объекты реального мира — в текущей реализации метод исгК просто выводит сообщение, но позднее его можно расширить так, что он будет выполнять настоящую работу. ООП и композиция: взаимосвязи типа заимеет» Понятие композиции в этой книге было введено в главе 22. С точки зрения программиста, композиция — это прием встраивания других объектов в объект-контейнер и использование их для реализации методов контейнера.

Для проектировщика композиция — это один из способов представить взаимоотношения в прикладной области. Но вместо того, чтобы определять принадлежность к множеству, при композиционном подходе все части объединяются в единое целое. Кроме того, композиция отражает взаимоотношения между частями, которые обычно называются отношениями типа «имеет». В некоторых книгах, посвященных объектно-ориентированному проектированию, композиция называется агрегированием (и различие между терминами состоит в том, что термин «агрегирование» используется для описания более слабой зависимости между контейнером и его содержимым); в этой книге термин «композиция» используется лишь для обозначения коллекции встраиваемых объектов. Вообще составные классы реализуют все свои интерфейсы, управляя работой встраиваемых объектов.

Теперь, когда у нас имеются реализации классов работников, объединим нх в коллектив пиццерии и позволим им приступить к работе. Наша пиццерия — это составной объект: в нем имеется печь и работники, такие как официанты и повара. Когда приходит клиент и делает заказ, все компоненты пиццерии начинают действовать — официант принимает заказ, повар делает пиццу и т. д. Следующий пример (файл р!ггавлорру) имитирует все объекты и взаимоотношения между ними: ггсе еар1суеев юрогт Ртззаясьбт, Бегчег с1авв Счвтсаег. бе( юы (ве1 П паве).' ве1!.паве = паве бег сгбег(ве1г, вегчег) ргтпт ве1(.паве, "сгбегв тгса", вегчег бе( рау(ве1г, вегчег): ргьпт ве1(.паве, "раув гсг ттеа тс", вегчег с1авв Очеп: бе( саке(ве1(): рг!пт "счеп Ьаяев' 644 Глава 25.

Шаблоны проектирования с классами с1ввв РтггвВпор; оег 1п11 (ве!г) ве1(нмгчег = Вегчег('Рв!') № Встроить другие обьекты ве1(.спет = Р1ггвяоьог('Воь') № Робот по ииени ьоь ве1(.очеп = Очеп() Оет огоег(ве)Г, пвве); совговег = совговег(пвве) счвтовег.огоег(ве1(.вегчег) ве1(.свет.иогК() ве1(.очес.Ьвке() счвтовег.рву(ве11.вегчег) № Яктиеизироевть другие обьекти № Клиент делает звквз офиоивнту тт паве == " вв1п зсепе = РтггвЯПор() всвое.огсег( новег ) ргтпг всвое.огбег('Влвдду') № Воздеть составной обьект № Ииитировать заков клиента Иоввг № Ииитироввть звказ клиенте Влвдду с.<ру1поп~екввр1ев> русьоп р1ггвзьор.ру Новег огбегв Ггов <Евр1оуее: пвве=Рвг, вв1вгу=40000> ВоЬ ввКев р!ггв очес ЬвКев Новвг раув Гог !1ев го <Евр1оуее: пеев=Рог, вв1вгу=40000> Впвдду огоегв ггов <евр1оуее: пеев=Реп зв1вгу=40000> ВоЬ ввкев р1ггв очес ЬвКев ВПвдду раув Гог ггев го <Евр1оуее: пепе=Рви вв1вгу=40000> Это всего лишь игрушечная имитация, но объекты и взаимодействия между ними наглядно демонстрируют составные объекты в действии.

Классы могут представлять практически любые объекты и взаимоотношения между ними, которые можно выразить словами; для этого просто замените илгена существительные классами, глаголы — методами, и вы получите первый черновой набросок проекта. Класс Р(ггзЯПор — это контейнер и контроллер — это конструктор, который создает и встраивает экземпляры классов работников, написанные нами в предыдущем разделе, а также экземпляры класса Очеп, который определен здесь. Когда программный код самопроверки этого модуля вызывает метод огбег класса Р(ггвЗЬор, встроенным объектам предлагается приступить к выполнению своих обязанностей.

Обратите внимание, что для каждого клиента мы создаем новый экземпляр класса Сов!овег и передаем встроенный объект Вегчег (официант) методам класса Сов!Ьвег (клиент) — клиенты приходят и уходят, а официант остается частью коллектива пиццерии. Кроме того, обратите внимание, что работники по-прежнему вовлечены во взаимосвязи наследования — композиция и наследование — это взаимодополняющие инструменты. Если запустить этот модуль, наша пиццерия обслужит два заказа — один от Гомера (Ношег) и другой от Шагги (Я)таяну): ООП и композиция; взаимосвязи типа «имеет» 645 Еще раз об обработке потоков Рассмотрим более реалистичный пример использования приема композиции. Вспомните универсальную функцию обработки потоков данных, которая частично была реализована во введении в ООП в главе 22: бег ргооеввог(гевбег, оопчегсег, ягссег): япые П багз = гезбег.гезб() 1( пот бета: Ьгеая бата = сопчегтег(бвтв) ггг(тег.ег(те(багз) Однако вместо простой функции мы могли бы реализовать обработку в виде класса, который использует прием композиции, чтобы обеспечить поддержку наследования и более удобную конструкцию программного кода.

Характеристики

Тип файла
DJVU-файл
Размер
11,21 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6353
Авторов
на СтудИзбе
311
Средний доход
с одного платного файла
Обучение Подробнее