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

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

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

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

Приемы организации взаимодействия классов Расширение — это лишь один из способов организации взаимодействий с суперклассом. В файле ниже, врес(айге.ру, определяется несколько классов, которые иллюстрируют различные приемы использования классов: Зорег Определяет метод аеслоз и метод Ве1едасе, который предполагает наличие метода асс(оп в подклассе. 1плег11ог Не предоставляет никаких новых имен, поэтому он получает все, что определено только в классе Зоре г. Звр1асвг Переопределяет метод вет воз класса Зоре г своей собственной версией. Ех(епсег Адаптирует метод ае(Ьоз класса Зорег, переопределяя и вызывая его, чтобы выполнить действия, предусмотренные по умолчанию. Ргсу>сег Реализует метод асс>оп, который ожидается методом Ве1едасе клас- са Зорег.

Рассмотрим каждый из этих классов, чтобы получить представление о способах, которыми они адаптируют свой общий суперкласс. Содер- жимое самого файла приводится ниже: с1азв Зорег. оег песпоо(зе1(). рг>пс '>п Зорег.юе(пос' Ое( Ое1еда(е(ве1(): вен,асс(оп() р Поведение по умолчанию а Ожидаемый метод »> х = Зорвг() »> х.аеспоа() 1п Зорег.аеспос Глава 24. Подробнее о программировании классов 605 Наследование с1аяя !ппегыог(яорег), паяя № Наследует иетоди, как они есть с1аяя аер1асег(яирег): № Пояностнв запевает ветаоо Оег ветпоо(яе1(): рг!п! '!п Пер1асег.ве!Поо' с1аяя Ехтепбег(ячрег); Ое! ве!ПОО(яе1().

рггпт 'ягаг(!пр Ех!епоег.ве!Пес' ворог.ее!пес(яе1г) рггпг 'епо!пр Ехгепоег.веслоо № РасшиРяет поведение иетода ветлоо с1аяя Ргоюбег(яорег): № Определяет необходииий иетод Оег аст!Оп(яе1г): рг!п! '1п Ргочаоег.асс!оп' тт паве == ' вагп гог к1аяя гп (1ппег!!ог, аер1асег, ехтепоег). рг!п! 'гп' г К1аяя. паве + '. к1аяя().ве!поо() рггпг ''гпргоч!Оег х = Ргоч!Оег() х.ое1еаа!е() % русаоп ярос!абае,ру 1ппегыаг,,, гп Вчрег.ветлоо аер1асег..

гп аер1асег.ветлоо Ех!епоег... я!ау!!яд Ехтепоег.ве!Поо !и Борег.ее!лоб епо!пр Ехтепоег.ее!лоб Ргоч1оег. гп Ргоч!Оег,асг!оп Абстрактные суперклассы Обратите внимание, как работает класс Ргоч!бег в предыдущем приме- ре. Когда через экземпляр класса РгочЫег вызывается метод Ое1ерасе, инициируются две независимые процедуры поиска: Здесь следует отметить несколько моментов.

Программный код тестирования модуля в конце примера создает экземпляры трех разных классов в цикле гог. Поскольку классы — это объекты, можно поместить их в кортеж и создавать экземпляры единообразным способом (подробнее об этой идее рассказывается ниже). Кроме всего прочего, классы, как и модули, имеют атрибут паве — он содержит строку с именем класса, указанным в заголовке инструкции с1авя. Ниже показано, что произойдет, если запустить файл: 606 Глава 24. Подробнее о программировании классов 1. При вызове х.г)е1епаге интерпретатор отыскивает метод ое1ераге в классе берег, начиная поиск от экземпляра класса Рго г1г)ег и двигаясь вверх по дереву наследования. Экземпляр х передается методу в виде аргумента ве1Г, как обычно.

2. Внутри метода 8зрег. г)е1ера1е выражение ае1(, асыоп приводит к запуску нового, независимого поиска в дереве наследования, начиная от экземпляра ве1( и дальше вверх по дереву. Поскольку аргумент ае1( ссылается на экземпляр класса Ргоа1зег, метод асшоп будет найден в подклассе Ргои1зег. Такой способ «восполнения пробелов» в реализации — обычное дело для платформ ООП.

По крайней мере, в терминах метода г)е1ераге такие суперклассы, как в этом примере, иногда называют абстрактными суперклассами — классы, которые предполагают, что часть их функциональности будет реализована их подклассами. Если ожидаемый метод не определен в подклассе, интерпретатор возбудит исключение с сообщением о неопределенном имени, когда поиск в дереве наследования завершится неудачей. Разработчики классов иногда делают такие требования к подклассам более очевидными с помощью инструкций аввегг или возбуждая встроенное исключение )(о11ар1еаепгасЕггог: с1аав Зсрег: еег ееспсо(ве)г); рг)пс '1п Зирег.еегвсз еег се1есасе(ее1г): ве1(,асыоп() Ее( асысп(ае1().

авеегс О, 'ас11сп аиег Ве Ее(1пео'' Мы познакомимся с инструкцией авве гс в главе 27, а пока лишь замечу, что если выражение возвращает ложь, она возбуждает исключение с сообщением об ошибке. В данном случае выражение всегда возвращает ложь (0), чтобы вызвать появление об ошибке, если метод не будет переопределен и поиск по дереву наследования остановится на этой версии. В некоторых классах, напротив, в таких методах-заглушках исключение йо11ар!евепгеОЕггог возбуждается напрямую. Инструкцию возбуждения исключений га1ве мы рассмотрим в главе 27. Более реалистичный пример использования концепций, представленных в этом разделе, вы найдете в упражнении 8 в конце главы 26 и в решении этого упражнения в разделе «Часть Ч1, Классы и ООП» (приложение В). Такое частичное наследование является традиционным способом введения в ООП, но оно постепенно исчезает из арсенала многих разработчиков.

Перегрузка операторов Перегрузку операторов мы коротко рассмотрели в предыдущей главе, а здесь мы обсудим все более детально и рассмотрим несколько наиболее 607 Перегрузка операторов ° Классы могут также перегружать такие операции, как вывод, вызов функций, обращение к атрибутам и т. д.

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

Специальные методы, такие как атн, позволяют перехватывать и выполнять встроенные операции: с1аэз ИиаЬег; бвт спи (эе1(, эсагс); и Визов ИиаЬвг(эгвгт) ЗЕ1(.бата = Этвгт бвт эио (ве1(. отоег) И Вирвиенив; экземпляр - другой гесигп ииаьег(эе1(.баса — о(пег) Ф Результат - новой экземпляр »> Сгов пивЬег 1врогС ИиаЬег »> Х = ИивЬег(5) »>У Х-2 »> У.бата 3 и Извлечь класс из иодуля и Иивовг тпбг (Х, 5) и ИивЬвг,,зиЬ (Х, 2) В У - повий экзвипляр класса ИиаЬвг Как уже обсуждалось ранее, конструктор спсС, присутствующий в этом примере, — это наиболее часто используемый метод перегрузки оператора в языке Ру()соп, потому что он присутствует в большинстве классов. В этом разделе мы изучим некоторые другие инструменты, связанные с перегрузкой, и рассмотрим наиболее типичные примеры их использования.

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

Ниже приводится краткий обзор ключевых идей, лежащих в основе механизма перегрузки: ° Перегрузка операторов в языке Ру()соп позволяет классам участвовать в обычных операциях. ° Классы в языке Руа)(оп могут перегружать все операторы выражений. 608 Глава 24, Подробнее о программировании классов список имен специальных методов вы найдете в других книгах, посвя- щенных языку РуФ)юп, и в справочных руководствах. Таблица 24Л. Общие методы перегрузки операторов Метод Перегружает Вызывается 1пы Ое1 ог Вызовы функций Обращение к атрибуту Прнсванванне атрибутам Х() Х.орое(!пес Х.эпу = чэ1ое Доступ к элементу по ин- дексу Х[кеу], циклы гог н другие конструкции итерации, прн отсутствии метода 1!ег Х[кеу] = чэ1ое Присваиванне элементу по индексу ве!!сев 1еп оар гасо !эсс х!ег Циклы Гог, оператор пц генерато- ры списков, аз р н другие Все методы перегрузки имеют имена, начинающиеся и заканчивающиеся двумя символами подчеркивания, что отличает их от других имен, которые вы обычно определяете в своих классах.

Отображение операторов выражений или операций на методы со специальными именами предопределяется языком РуФ)гоп (и описывается в стандартном руководстве по языку). Например, по определению языка оператор + всегда отображается на имя абб независимо от того, что в действительности делает метод асб Все методы перегрузки операторов являются необязательными — если какой-то метод не реализован, это лишь означает, что соответствующая ему операция не поддерживается классом (а при попытке применить такую операцию возбуждается исключение). Большинство методов перегрузки операторов используются только при решении специальных герг в!г сэ1! 9е!эссг ве!выг 9е!!сеа Конструктор Деструктор Оператор+ Оператор [(побитовое ИЛИ) Вывод, преобразование Длина Сравнение Специальное сравнение Специальное сравнение Правосторонний оператор+ Добавление (увеличенне) Итерационный контекст При создании объекта: Х = С1эвв() При уничтожении объекта Х+ У,Х+= У Х ] У, Х /= У рг!п! Х, герг(Х), в!г(Х) 1еп(Х), проверка истинности х==у,х<у Х < у(внномслучае сэр ) Х == у(виномслучае сэр ) Не экземпппр + Х Х += У(виномслучае эос ) 609 Перегрузка операторов Яе61еп] реализует доступ к элементам по индексу Метод де11(ев реализует операции доступа к элементам по индексу.

Когда экземпляр Х появляется в выражении извлечения элемента по индексу, таком как Х[т], интерпретатор Ру1]топ вызывает метод дет[тев, наследуемый этим экземпляром (если он имеется), передавая методу объект Х в первом аргументе и индекс в квадратных скобках во втором аргументе. Например, следующий класс возвращает квадрат значения индекса: »> с1авв 1пбвхег: бвг дет1тев (ве1г, 1пбех): гетегп 1пбвх ° ° 2 »> Х = [пбехег() »> Х[2] »> Гог 1 1п галде(6): рг1пт Х[1], в Вырвхвние х[43 вызывает двгттвп (х, 4).4 О 1 4 9 16 Яет!реп] и Нег реализуют итерации Здесь описывается прием, который не всегда очевиден для начинающих программистов, но на практике может оказаться необычайно полезным.

Инструкция (ог многократно применяет операцию индексирования к последовательности, используя индексы от нуля и выше, пока не будет получено исключение выхода за границы. Благодаря этому метод детттеп представляет собой один из способов перегрузки итераций в языке Ру1Ьоп — если этот метод реализован, инструкции циклов Гог будут вызывать его на каждом шаге цикла, с постоянно увеличивающимся значением смещения. Это один из случаев, когда 4 купив один предмет, другой получаешь в подарок в, — любой встроенный или определяемый пользователем объект, к которому применима операция индексирования, также может участвовать в итерациях: »> с1авв атвррег: бет де11теа (ве]Г, гетогп ве1т,бата[1] »> Х = втеррег() »> Х.бата = "драв" »> в Х вЂ” зто зкзвыллвр класса зтвррег задач, когда необходимо, чтобы объекты имитировали поведение встроенных типов, однако конструктор !п11 присутствует в большинстве классов.

Мы уже познакомились с конструктором тот 1, который вызывается на этапе инициализации, и с несколькими другими, перечисленными в табл. 24.1. Теперь мы исследуем примеры использования некоторых других методов из таблицы. Глава 24. Подробнее о программировании классов 610 »> Х[13 Р »> Гог 11ва 1п Х; рг1п1 11еа, № Индексирование, вызывается детзтеа № циклы Гог вызывают детзтев № Гог индексирует элеиенты ОГ.

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

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

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

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