Главная » Просмотр файлов » Саммерфилд - Программирование на Python 3

Саммерфилд - Программирование на Python 3 (1077331), страница 100

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

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

Усовершенствованные приемы программирования Методы [п[т () и ьпПо() должны переопределяться в дочерних классах, потому что оба они объявлены абстрактными. Точно так же должно переопределяться свойство свп апПо, доступное только для чтения. Подклассы могут не переопределять метод аПП ьпПЬ( ), хотя это и не возбраняется. Метод ьпоо() таит в себе одну хитрость. Список ве1(, опПов, как ожидается, должен хранить ссылки на методы. Каждый метод в списке должен выполнять действия по отмене соответствующих изменений — все станет намного понятнее, когда мы рассмотрим подкласс класса ОЬПо, который приводится чуть ниже.

То есть, чтобы выполнить отмену, из списка ве1(, ьпПов извлекается последний метод отмены и затем вызывается как функция, которой в виде аргумента передается ссылка ве1(. (Мы вынуждены передавать ссылку яе1(, потому что в данном случае метод вызывается как функция, а не как метод.) Ниже приводится начало определения класса 8тасн. Он наследует класс ()псе, поэтому любые действия, выполняемые над ним, можно отменить, вызвав метод 8твсп. ьпПс() без аргументов: с1ввв 8твся(впво); Пет (птт (ве1(); впряг(). 1П!т () ве1(, втасн = [] Юргорегту Пет сап аппо(ве1т); гетигп впряг().свп аппо Пет епоо(ве1(): вирег().епоо() Пет ривл(ве!Г, ттее): ве1Г. втвся.еррепо(ттее) ве1г.впп иппо(1ееьпв ве1г: ве1г, втеся.рор()) Пет рор(ве!т): нее = ве1г, втвсю рор() ве1(,аПП епоо(1вепва яе1Г; ве1Г. втвсм аррепс((тее)) гетегп ттее Мы опустили методы 8тасн.

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

Но в данном случае мы специально предусмотрели обязательное их переопределение в подклассах, чтобы реализация отмены выполнялась с учетом особенностей подкласса. Методы рзвл() и рор() выполняют основную операцию и добавляют в список методов отмены функцию, 449 Улучшенные приемы объектно-ориентированного программирования с помощью которой можно будет выполнить отмену только что выпол- ненной операции. Наибольшую пользу абстрактные классы приносят в крупных программах, в библиотеках и в прикладных платформах, где они помогают обеспечить взаимодействие между классами независимо от того, кем они написаны, и от особенностей их реализации, потому что они будут обеспечивать прикладные интерфейсы, объявляемые абстрактными базовыми классами.

Множественное наследование Множественное наследование возникает там, где один класс наследует два или более других классов. Хотя язык Ру(Ьоп (и, например, С++) полностью поддерживает множественное наследование, некоторые языки программирования, наиболее заметным из которых является язык Ъача, такой возможностью не обладают.

Одна нз проблем состоит в том, что множественное наследование может привести к тому, что один и тот же класс будет унаследован несколько раз (например, когда два базовых класса наследуют один общий класс), а это означает, что вызываемая версия метода, не реализованного в подклассе, но реализованного в двух или более базовых классах (или в их базовых классах и т. д.), зависит от того, в каком порядке выполняется поиск в базовых классах, что может сделать классы, наследующие несколько классов, довольно неустойчивыми. Вообще говоря, множественного наследования можно избежать, применяя простое наследование (один базовый класс) и добавляя мета- классы, когда возникает необходимость в поддержке дополнительных АР1, поскольку, как будет показано в следующем подразделе, мета- класс может использоваться, чтобы взять обязательство о поддержке определенного АР1, без фактического наследования каких-либо методов или атрибутов данных.

Как вариант, при множественном наследовании можно использовать один конкретный класс и один или более абстрактных классов — для обеспечения поддержки дополнительных АР1. Еще одно решение состоит в том, чтобы использовать простое наследование и агрегировать экземпляры других классов. Тем не менее в некоторых случаях множественное наследование предоставляет очень удобное решение. Например, предположим, что нам необходимо создать новую версию класса Ятасн, рассматривавшегося в предыдущем подразделе, которая обеспечивала бы возможность загружать и сохранять данные с помощью модуля р! сК1е.

Нам необходимо добавить возможность загрузки и сохранения в нескольких классах, поэтому мы реализуем эту функциональность в виде отдельного класса: с1ааа 1оаСЯане: пег тптт (ае1г, гт1апаае, *аттгшите пааеа): Глава 8. Усовершенствованные приемы программирования ве1(. (11епаае = Г11епвае ве1(, вССгсььте пааев = () Гог паве 1п аттг1ЬЬСе пзаез; !Г пвае.втагтва(СП(" "): паве = " " а ве1Г, с1ввз . папе а паве ве1(.

ассгсььсе пааев.аррепб(пвае) бет ваче(зе1Г): асСП орел(ве1Г,Г!1епаае, таЬ") ав ГЬ: бвтв = () Гог паве сп ве1(. зыгсЬЬСе пааев: баса.аррепб(ресассг(ве1г, пвае)) р1сК1е.беар(бвтв, ГП, р!ЬК1е.Н16НЕРТ РРОТОСОС) бет 1оаб(зе1(): а1сп преп(ве1(.гс1епаае, "гь") вв гь: бата = рсСК1Е. 1сзб(ГЬ) Гог паве, чв1ие !и г1р(ве1(.

аттг1Ььте пааез, бате); веСаттг(зе1Г, папе, ча1ие) Класс имеет два атрибута: (1!епаае — который является общедоступным и может изменяться в любой момент, и аССг1Ььте пааев — который доступен только для чтения и может устанавливаться только в момент создания экземпляра. Метод ваче() выполняет итерации по всем именам атрибутов и создает список с именем бата, в котором запоминаются значения всех сохраняемых атрибутов, после чего данные записываются в файл средствами модуля рссК1е. Инструкция н1СЬ гарантирует, что открытый файл будет закрыт и любое возникшее исключение будет передано вверх по стеку вызовов. Метод 1саб( ) выполняет итерации по именам атрибутов и соответствующим им элементам данных, и в каждый из атрибутов записывается его значение, загруженное из файла.

Ниже приводится начало определения класса Р11е8СасК, наследующего класс Опбо из предыдущего подраздела и класс ссаб8аче из этого подраздела: с1ввв Рс1езтасК(бпбп, Совбвзче): бет 1п11 (ве1Г, Г!1епаае): Опбо. 1пст (ве1Г) Ерабззче. 1п1С (ве1Г, Г!1епаае, " в!вся") ве1Г, зСзсК = () бет 1паб(ве1Г): вирег(). 1овб() ве1Г. с1ев г( ) Остальная часть класса совпадает с определением класса 8СасК, поэтому мы не стали воспроизводить ее здесь. Мы используем метод сп1с (), в котором задаем инициализируемые базовые классы, вместо использования функции зьрег(), которая не способна предполагать, метод какого из базовых классов следует вызывать.

Методу ини- Улучшенные приемы объектно-ориентированного программирования 451 циализации класса КоабЗаче передаются имя файла и имена сохраняемых атрибутов — в данном случае это единственный атрибут, частный атрибут зтасК. (Мы не предполагаем (и не могли бы) сохранять значение атрибута опбеа, потому что его значением является список методов, которые невозможно сохранить в файле.) Класс Е(1еЗтасК содержит все необходимые методы отмены, а класс ОеабВаче — методы ааче() и 1оаб().

Мы не переопределяем метод ваче(), поскольку его реализация в базовом классе вполне отвечает нашим требованиям, но в методе 1оаб() сразу после загрузки нам требуется дополнительно очистить список отмен. Это необходимо, потому что после сохранения стека в файле мы могли выполнить некоторые операции над ним, а затем загрузить сохраненные ранее данные. Операция загрузки затирает данные, которые раньше находились в стеке„поэтому наличие каких-либо методов отмены в списке теряет всякий смысл.

Оригинальный класс Опбо не имеет метода с1еаг(), поэтому мы добавили свой: бег с1еаг(зе!т): Ф В классе Опбо зе1Г. опбоа = [] В методе зтаск.1оаб() мы использовали функцию зерег() для вызова унаследованного метода ОоабВаче.1еаб(), потому что в классе Опбе отсутствует метод 1еаб( ), который мог бы быть причиной неоднозначности. Если бы в обоих базовых классах имелся метод 1оаб(), то выбор вызываемого метода зависел бы от того, в каком порядке интерпретатор осуществляет поиск методов в базовых классах.

Предпочтительно использовать функцию залег() только при отсутствии неоднозначности, а в противном случае прямо указывать имя базового класса, чтобы не зависеть от того, в каком порядке интерпретатор просматривает базовые классы при поиске методов. В случае с вызовом зе1т. с1еаг() тоже нет никакой неоднозначности, потому что метод с1еаг() имеется только в классе Опбо, при этом нам не требуется использовать функцию Впрег(), потому что в классе Е(1вЗСасК (в отличие от метода!оаб()) отсутствует собственный метод с1еа г( ) .

Что произойдет, если позднее в класс Е11е8тасК будет добавлен метод с1еаг()7 Это может нарушить работу метода 1оаб(). Одно из решений этой проблемы состоит в том, чтобы внутри метода 1еаб() вместо ае1г.с1еаг() производить вызов метода как апрег().с1еаг(). Но это в свою очередь может привести к тому, что будет вызван первый метод с1еаг(), найденный в базовых классах.

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

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

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

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