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

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

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

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

Здесь также присутствует инструкция присваивания =. Так как эта инструкция выполняет присваивание имени ба!в внутри инструкции с1авв, оно создается в локальной области видимости класса и становится атрибутом объекта класса. Как и все атрибуты класса, атрибут бв!в наследуется и используется всеми экземплярами класса, которые не имеют собственного атрибута баса. Когда создаются экземпляры этого класса, имя баСа присоединяется к этим экземплярам через присваивание атрибуту ве1(, ба!а в конст- рукторе: Суть этого примера состоит в том, что атрибут дата находится в двух разных местах: в объектах экземпляров (создаются присваиванием атрибуту ве1т, бата в методе 1п!1 ) и в классе, от которого они наследуют имена (создается присваиванием имени бв!в в инструкции с1ввв).

Метод класса б1вр1ву выводит обе версии — сначала атрибут экземпляра ве1(, а затем атрибут класса. Используя этот прием сохранения атрибутов в различных объектах, мы определяем их области видимости. Атрибуты классов совместно используются всеми экземплярами, а атрибуты экземпляров уникальны для каждого экземпляра — ни данные, нн поведение экземпляра недоступны для совместного использования. Несмотря на то что операция поиска в дереве наследования позволяет отыскивать имена, мы Прн условии, что класс не переопределил операцию присваивания с помощью метода перегрузки оператора ве!а!тг с целью выполнять какне-то особые действия.

»> х = М!хебзааев(1) »> у М!хебзввев(2) »> х.б!вр1ау()1 у б!вр1ву() 1 врва 2 враз в Создаются два обьекта экзеипляров В каидый иэ которых имеет свой атрибут бата а зе1 П бата - это другие атрибуты, й а $ивс!авв.бата - тот ве самый 599 Методы всегда можем получить доступ к ним в любой точке дерева, обратившись непосредственно к нужному объекту, В предыдущем примере, например, выражения х. Сэта и ве11. Сатв возвращают атрибут экземпляра, которые переопределяют то же самое имя в классе. Однако выражение М! хедзазев.

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

Вызов метода экземпляра: 1овтаосе эетвов(вгдв...) автоматически преобразуется в вызов метода класса: с1ввв. эетооо1шывосе, агдв... ) где класс определяется в результате поиска имени метода по дереву наследования, Фактически в языке Ру$Ьоп обе формы вызова метода являются допустимыми. Помимо обычного наследования имен методов, первый специальный аргумент — это единственная необычная особенность методов. Первый аргумент в методах классов обычно называется ве1т, в соответствии с общепринятыми соглашениями (с технической точки зрения само имя не играет никакой роли, значение имеет позиция аргумента). Этот аргумент обеспечивает доступ к экземпляру, то есть к субъекту вызова— поскольку из классов может создаваться множество объектов экземпляров, этот аргумент необходим для доступа к данным конкретного экземпляра.

Программисты, знакомые с языком С++, сочтут, что аргумент ве11 в языке Ру1Ьоп напоминает указатель 1111в в языке С++. Однако в языке Ру1Ьоп имя ве1т всегда явно используется в программном коде: методы всегда должны использовать имя ве11 для получения или изменения атрибутов экземпляра, обрабатываемого текущим вызовом метода. Такая явная природа аргумента ве1т предусмотрена намеренно— присутствие этого имени делает очевидным использование имен атрибутов экземпляра.

Глава 24. Подробнее о программировании классов 600 Пример Чтобы пояснить эти концепции, обратимся к примеру. Предположим, что имеется следующее определение класса: № Определение класса № Определение метода № Изиенение экземпляра № Обращение к зкзеилляру с1авв иехсС1авв: Сес рып(ег(ве1Г, Сехг); ве1(.аевваре = Сехг ргспс ве1(.веввасе Имя рш псе г ссылается на объект функции, а так как оно создается в области видимости инструкции с1авв, оно становится атрибутом объекта класса и будет унаследовано всеми экземплярами, которые будут созданы из класса. Обычно методы, такие ьак рг1псег, предназначены для обработки экземпляров, поэтому мы вызываем их через экземпляры: № Создать зкземпляр »> х = ИехСС1авв() »> х.ргспСег('1пвСапсе саы ') № Вызвать его метод спвсапсе са11 № Экземпляр изменился »> х.вевваре '1пвгапсе са11' Методы могут вызываться любым из двух способов — через экземпляр или через сам класс. Например, метод ргспсег может быть вызван с ис- пользованием имени класса, явно передавая при этом экземпляр в ар- гументе ве1(: »> иехсс1ввв.ргспсег(х, 'с1ввв св11') № пряной вызов метода класса с1авв са11 № Экзеипляр снова изменился »> х.ввввврв с1авв сд11 Вызов метода, который производится через экземпляр и через имя класса, оказывает одинаковое воздействие при условии, что при вызове через имя класса передается тот же самый экземпляр.

По умолчанию, если попытаться вызвать метод без указания экземпляра, будет выведено сообщение об ошибке: »> ИехСС1авв. ргспСег('Ьае са11') турееггог спьоспо веспос ргспсег() вовс ье са11ес нып иехсс1авв тпвсапсе Когда метод вызывается с использованием составного имени экземпляра, как в данном случае, то сначала определяется местонахождение метода ргсп(ег, а затем его аргументу ве1( автоматически присваивается объект экземпляра (х). В аргумент сехс записывается строка, переданная в вызов метода (' спвгапсе са11'). Обратите внимание, что РуС)соп автоматически передает в первом аргументе ве1( ссылку на сам экземпляр, поэтому нам достаточно передать методу только один аргумент. Внутри метода ргспгег нмя ве1( используется для доступа к данным конкретного экземпляра, потому что оно ссылается на текущий обрабатываемый экземпляр.

601 Методы (туреЕггог: несвязанный метод рг1птег() должен вызываться с экземпляром Мех(С1аяя .,) Вызов конструкторов суперклассов с1аяя Яорег: Оет тптт (яе)т, х) ...программный код по умолчанию, с1аяя Вос(яорег): Оет тптт (яе1(, х, у); Ворог тпы (яе1(, х) ...адаптированный код... Ф Вызов метода тлтт суперкласса Ф Выполнить дополнительные действия 1 = Яоо(1, 2) Это один из немногих случаев, когда вашему программному коду потребуется явно вызывать метод перегрузки оператора. Естественно, вызывать конструктор суперкласса таким способом следует, только если это действительно необходимо — без этого вызова подкласс полностью переопределяет данный метод.

Более реалистичный случай применения этого приема приводится в заключительном примере этой главы.' Другие возможности методов Такой способ вызова методов через имя класса представляет собой основу для расширения (без полной замены) поведения унаследованных методов. В главе 26 мы познакомимся с еще одной возможностью, добавленной в Ру1Ьоп 2.2, статическими методами, которые не предполагают наличие объекта экземпляра в первом аргументе. Такие методы могут действовать как обычные функции, имена которых являются локальными по отношению к классам, где они были определены.

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

Дополнительные подробности приводятся в главе 25. Обычно методы вызываются через экземпляры. Тем не менее вызовы методов через имя класса могут играть особую роль. Одна из таких ролей связана с вызовом конструктора. Метод )п11 наследуется точно так же, как и любые другие атрибуты. Это означает, что во время создания экземпляра интерпретатор отыскивает только один метод тптт .

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

Интерпретатор выполняет поиск в дереве в направлении снизу вверх, от экземпляров к суперклассам, всякий раз, когда используемое имя подразумевает атрибут объекта экземпляра.' Специализация унаследованных методов Только что описанная модель поиска в дереве наследования представляет собой прекрасный способ специализации программ. Поскольку механизм наследования сначала пытается отыскать имена в подклассах и только потом в их суперклассах, подклассы могут изменять поведение по умолчанию, предусматриваемое атрибутами их суперклассов.

Фактически можно создавать целые системы как иерархии классов, возможности которых расширяются за счет добавления новых подклассов„а не за счет изменения существующего программного кода. Идея переопределения унаследованных имен приводит к множеству приемов специализации. Например, подклассы могут полностью замещать унаследованные атрибуты, предоставлять атрибуты, которые ожидается отыскать в суперклассах, и расширять методы суперкласса за счет их вызова из методов подкласса. Мы уже видели прием с замещением в действии. Ниже приводится пример, демонстрирующий, как выполняется расширение: »> с1авв Зсрег; бвт автаоб(ве1(): рг1т '1п Зсрег.аевпоб' »> с1авв ЗсЬ(Зсрег): бес аетпоб(ве1Г): № Переопределить метод рг1пв 'вгагь1пз зсь.аегьоб' № дополнительное действие Ворог.авваоб(ве1№) № Випопнить действие по умолчание рг1пь 'епб1пр зсь.аегпоб' Главное здесь — это прямые вызовы методов суперкласса.

Класс ЗЬЬ замещает метод веглоб класса Бсрвг своей собственной, специализирован- Это описание далеко не полное, потому что точно так же возможно создавать атрибуты экземпляров и классов с помощью инструкций присваивания за пределами инструкций с1авв — но этот прием используется существенно реже в зачастую более подвержен ошибкам (измевения не изолированы от инструкций с1авв) . В языке Рув)топ все атрибуты всегда доступны по умолчанию — более подробно о сокрытии данных мы поговорим в главе 26.

604 ной версией. Но внутри замещающего метода в классе ЗЬЬ производит- ся вызов версии, экспортируемой классом Зоре г, чтобы выполнить дей- ствия по умолчанию. Другими словами, метод ЗЬЬ. зеслод не замещает полностью метод Зоре г. ае(лод, а просто расширяет его: р Создать экземпляр класса Бырег в Вызвать Борег.юеглоо »> х = ЗЬЬ() Л Создать экземпляр класса Био »> х.ветпоа() Ф Вызват~ БоЬ.ив(поп, который вызовет Бирег.иегпоо зтагмпд ЗоЬ.юеспос >и Берег.юетлос епшпд Зоо.ае(поа Этот прием расширения также часто используется в конструкторах, за примерами обращайтесь к предыдущему разделу «Методы».

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

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

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

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