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

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

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

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

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

Вследствие такого изменения суперклассы, расположенные ниже, получают возможность переопределять атрибуты суперклассов, стоящих выше, независимо от вида деревьев множественного наследования. Пример ромбоидального наследования В качестве иллюстрации рассмотрим следующую упрощенную реали- зацию ромбоидального наследования для классических классов: № Классииескап модель № Седлала поиск дойдет до д, потоп до С В этом случае атрибут атт г будет найден в суперклассе А, потому что в классической модели поиск в дереве наследования сначала производится в высоту, и только потом происходит смещение вправо — интерпретатор выполнит поиск в классах в следующем порядке: О, В, А и затем С (впрочем, поиск прекратится, как только атрибут а(т г будет найден в суперклассе А, расположенном выше суперкласса В), В классах нового стиля, наследующих встроенный тип, такой как оЬ) ест, прежде чем просмотреть суперкласс А, интерпретатор сначала выполнит поиск в суперклассе С (правее суперкласса В), то есть, в следующем порядке: О, В, С и затем А (но в этом случае поиск остановится в суперклассе С): »> о1ввв А(ов)вот): зттг = т »> с1ввв В(А): резв »> с1взз С(А): вттг = 2 »> с1ввв 0(В,С): Резв »> х = О() »> х.вттг 2 № Ноеий стиль № Скакала поиск дойдет до С, потоп до А Это изменение процедуры поиска основано на предположении, что если вы добавляете класс С в дерево ниже, это значит, что вы хотите получить его атрибуты раньше, чем атрибуты класса А.

Кроме того, это »> о1звв А: зттг = т »> о1ввв В(А): Рвзв »> о1ввв С(А): зттг = 2 »> о1ввз 0(В,С): Резв »> х = О() »> х.зттг т Глава 2б. Дополнительные возможности классов 671 Классы нового стиля изменение предполагает, что класс С всегда будет иметь возможность переопределить атрибуты класса А, что, скорее всего, верно, когда пишется самостоятельный класс, но совсем неверно, когда в ромбоидальиой схеме принимают участие классические классы — вы можете даже не подозревать, что класс С может участвовать в подобной схеме наследования, когда пишете его.

Явное разрешение конфликтов имен »> с)авв А: в11г = 1 »> с)авв В(А): раза »> с)авв С(А): а11г = 2 »> с)азв О(В,С): в11г = С.а11г »> х = О() »> х.а11г 2 № Классическая иодель № Выбрать С, справа № Работает как класс нового стиля Здесь дерево классических классов имитирует порядок поиска, принятый в модели классов нового стиля: присваивание атрибуту а11г в классе О явно выбирает версию атрибута из класса С, благодаря чему нарушается обычный порядок поиска в дереве наследования (атрибут О. а11г находится ниже в дереве). Точно так же классы нового стиля могут имитировать порядок поиска в классической модели, выбирая требуемый атрибут там, где может происходить смешение: »> с)авв А(оо)ес1); в11г 1 »> с)авв В(А): рава »> с)азз С(А): а11г = 2 »> с)авв О(В,С): а11г = В.аттг »> х = О() »> х.а11г 1 № Новей стиль № Вшбрать Я.аггг, ешше № Работает как классический класс Если вам необходимо всегда явно разрешать конфликты, подобные этим, вы можете просто игнорировать различия в порядке поиска и не полагаться на предположения о том, что имеется в виду, когда вы пишете свои классы.

Естественно, такой способ выбора атрибутов может также применяться и к методам, потому что методы — это обычные объекты: »> с)авз А: оег ветл(з): рг1л1 'А.ветл' »> с)авз С(А): ОЕГ Ввтв(в): Рг(пт 'С.ветс' Проблема с предположениями — в том, что они всего лишь предположения. Если такое отклонение в процедуре поиска кажется вам слишком трудным для запоминания или вам требуется более полное управление процедурой поиска, вы всегда можете произвести выбор желаемого атрибута из любого места в дереве, выполнив присваивание или как-то иначе обозначив его там, где может возникнуть смешение классов: б72 Глава 26. Дополнительные возможности классов »> с1авв В(А): рава »> с1авв 0(В,С): рава № Использовать порядок поиска по умолчанию »> х - "О() № Зависит от типа класса »> х.авва() № По умолчанию используется классический порядок поиска А.ветл »> о1авв 0(В,С): ввгь = С.авгв »> х = О() »> х.авсв() С.автл № Выбрать метод класса С: новый стиль № Выбрат~ метод класса В: № клзссическая модель »> с1авв 0(В,с); ввсл = В.авсл »> х = О() »> х.авва() А.ювтл с1авз 0(В,С): бвт аегп(ве1т): № переопределяется ниив с.ав(л(вв1() № Вызовои выбрат~ метод класса с Такой выбор путем присваивания или вызова в точках смешения может эффективно обезопасить ваш программный код от возможных различий между разными моделями классов.

Явное разрешение конфликтов таким способом гарантирует, что правильная работа вашего программного кода не будет зависеть от версии РуФЬоп в будущем (независимо от необходимости наследовать встроенные типы, чтобы использовать новую модель).' Итак, поиск в ромбоидальной схеме наследования выполняется поразному в классической и в новой моделях, и это изменение нарушает обратную совместимость. Однако имейте в виду, что это изменение за- Даже если не учитывать расхождения между классической и новой моделями, данная методика иногда может пригодиться в случаях множественного наследования. Если вам необходимо получить часть атрибутов от суперкласса слева, а часть — от суперкласса справа, вам может потребоваться указать интерпретатору Русаков, какие именно атрибуты следует выбирать, выполняя явное присваивание в подклассах.

Мы еще вернемся к атому вопросу в разделе с описанием типичных проблем в конце этой главы. Кроме того, обратите внимание, что ромбондальные схемы наследования в некоторых случаях могут доставлять еще больше хлопот, чем я описал здесь (например, что если оба конструктора классов В н С вызывают конструктор класса А, н прн этом необходимо вызывать оба наследуемых конструктора в подклассе7), но это лежит за пределами рассмотрения данной книги.

Здесь мы явно выбираем методы, выполняя присваивание именам, на- ходящимся ниже в дереве. Мы могли бы просто вызвать метод желае- мого класса явно; на практике этот подход, возможно, является более принятым, в особенности при работе с конструкторами: 673 Классы нового стиля трагивает только ромбоидальные схемы наследования — во всех других схемах принцип действия модели наследования нового стиля не изменился. Кроме того, вполне возможно, что вся эта проблема будет носить скорее теоретический характер, чем практический, — с выходом версии Ру(Ьоп 2.2 эти изменения не оказали достаточно существенного влияния, н потому маловероятно, что они затронут значительную часть программного кода на языке РуФЬоп.

Другие расширения в классах нового стиля Помимо изменения порядка поиска в ромбоидальной схеме (что само по себе слишком неясно, чтобы иметь большое значение для большинства читателей этой книги) классы нового стиля привносят несколько еще более сложных возможностей. Ниже приводится краткий обзор каждой из них.

Статические методы и методы класса Начиная с версии Ру1Ьоп 2.2 появилась возможность определять методы класса, которые могут вызываться без участия экземпляра; сптаптические методы работают почти так же, как обычные функции, только расположенные внутри класса, а методы класса получают сам класс вместо экземпляра. Чтобы сделать возможными эти режимы работы методов, внутри класса должны вызываться специальные встроенные функции зтат(светяаб и с1авваетлоб. Несмотря на то, что эта особенность была добавлена вместе с классами нового стиля, ее можно использовать и в классических классах тоже.

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

Например: »> о1авв 11а1твг(оЬ)вот): в1отв = ('вдв', 'паев', ')оь'1 »> х = 11а1твг() »> х.адв Е Присваивание должно быть выполнено раньше иопопьзоввыип Аттг1ьотееггог аде »> х.вдв = 40 »> х.адв 40 674 Глава 26. Дополнительные возможности классов »> х.ара = 1000 Ф Недопустимое ммп: отсутствует а плотах Атт г)ЬитаЕ ггсг: ' 1ш1(аг ' ЬЬ) аст пав пс атт г1Ььта ' ара ' (АттыЬстаЕггсг: сбьект '11аттаг' на имеет атрибута 'аре') Эта особенность должна помочь ликвидировать ошибки, обусловленные простыми м опечатками у (обнаруживается попытка присваивания атрибутам, отсутствующим в списке 010(в ) и обеспечить некоторую оптимизацию (атрибуты слота могут сохраняться не в словаре, а в кортеже, обеспечивая тем самым более высокую скорость поиска).

Однако слоты — это своего рода нарушение динамической природы языка РуЫюп, которая диктует, что операция присваивания может создавать любые имена. Кроме того, у них имеются дополнительные ограничения и следствия, которые слишком сложны, чтобы обсуждать их здесь. Например, некоторые экземпляры со слотами могут не иметь атрибут словаря бтст, что может сделать некоторые метапрограммы, которые мы создавали в этой книге, более сложными, например, инструментам, выполняющим поиск атрибутов, скорее всего придется искать имена в двух источниках вместо одного.

За дополнительной информацией обращайтесь к документации к выпуску РуФоп 2.2 и стандартному набору руководств по языку РуЫтоп. Свойства класса Механизм, известный как свойства, обеспечивает в классах нового стиля еще один способ определения методов, вызываемых автоматически при обращении или присваивании атрибутам экземпляра. Эта особенность во многих случаях представляет собой альтернативу методам перегрузки операторов ретаттг и ветаттг, которые мы рассматривали в главе 24. Свойства обладают тем же эффектом, что и эти два метода, только в этом случае выполняется вызов метода даже при простом обращении к атрибуту, что бывает полезно для атрибутов, значения которых вычисляются динамически.

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

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

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

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