Лутц М. - Изучаем Python (1077325), страница 172
Текст из файла (страница 172)
Методы меягакласса. Я решил это упражнение, как показано ниже. Обратите внимание, что операторы будут извлекать атрибуты с помощью метода детаТТг — он должен возвращать значение, чтобы операторы могли работать: »> с1ввв НаСа: Се? десаттг (зе1Г, паве): рг!пс 'де!', паве сег веса!!к (ве1г, паве, ча1це); рг!и! 'ве!', паве, ча1цв »> х = Ив!в() »> х.аррвпй дет вррепб »> х.зрвв "рогК" зет пращ роги »> »>х+2 дет соегсе ТгвсеЬвсК (тппегвоз! 1ззт): Р!1е "<зто!и>", 1!пе 1, !п ? ТуреЕггог: са11 оу поп-Гцпст!оп (ТуреЕггог: попытка вызова объекта, не являющегося функцией) »> »> х[!] де! де!!Тев ТгвсеЬаск (!ппегвозт 1вз!): Е!1е "<зто!п>", 1!пе 1, !п ? ТуреЕггог; св11 от поп-Гцпст!оп (ТуреЕггог: попытка вызова обьекта, не являющегося функцией) »> х[1:6] дет 1еп тгасеьаск (!ппегюозт 1взт): Р>1е "<зтотп>", 1тпе ?, !п ? ТуреЕггаг: св11 о( поп-Гцпст!оп (ТуреЕггог: попытка вызова объекта, не являющегося Функцией) 5.
Обаеклгы множеств. Ниже приводится сеанс взаимодействия, который должен у вас получиться. Комментарии описывают, какие методы вызываются. % руспоп »> Ггою веСигаррег !врогт зеС »> х = двт([1, 2, 3, 4]) а Вызывается ,]лтг Приложение В »> у = Зег([3, 4, 5]) № ало, !пгвгзеса затеи гврг »> х а у Зет; [3, 4] »>х[у Зет;[1, 2, 3, 4, 5] № ог, ил>оп, затеи герт »> г Зег("Ье11о") »> г[0], г[-1] ('Ь', 'о ) № гл]г удаляет повторяюииеся символы № дегггви »> Гог с 1п г: рг1пг о, № дат!сею се)о >» 1еп(г), г № ]вл, герт (4, Зет.['Ь', 'е', '1', 'а']) »> г а "ше11о", г ] "ше11о" (Зет.'['е', '1', 'о'). Зв1:['Ь', 'е', '1', 'о', 'и']) Мой расширенный подкласс, позволяющий обрабатывать сразу несколько операндов, приводится ниже (файл лги]1]ве(.ру).
В нем потребовалось изменить всего два метода из оригинального набора. Строка документирования в классе поясняет принцип его действия: ггош зетшгаррег тврогт Зе! с1азз иы111звт(зет); Наследует все атрибуты класса Зет, но расширяет методы 1птегавот и цп!оп, добавляя возможность обработки нескольких операндов; обратите внимание, что "зе1г' - по-прежнему первый аргумент (теперь сохраняется в списке аргументов агдз). Кроме того, обратите внимание, что теперь унаследованные операторы 6 и ) вызывают новые методы с двумя аргументами, но для одновременной обработки более чем 2 операндов требуется вызов иетода, а не выражения; № Зв!? - агдз! О] № Для всех аргументов № Для всех узлов № Добавить новый элемент в результат Ое( 1птегзес1(зе1?, о!пега): гез = [] (ог х 1п зе1(; (ог отЬег (п отЬегз: 1( х пот (п о!пег: е1зв; гез.аррепо(х) гетыгп Зет(гез) Ое? оп!оп(*агре): гез = [] ?ог зез 1п агдз: (ог х 1п зец: 1Г пот х тп гез: гез.аррепс(х) гетцгп Зет(гез) № Сканировать первую лоследов-ть № Для всех остальных аргументов Ьгеак № Элемент присутствует во всех? № Нвт: прервать цикл № Да.
добавить элеиент в конец ВЗЗ Решения упражнений Ваш сеанс взаимодействия с интерактивной оболочкой должен выглядеть примерно так, как показано ниже. Обратите внимание, что пересечение двух множеств можно находить как с помощью оператора 8, так и с помощью метода 1п1егзес1, но для случая трех и более множеств обязательно нужно вызывать метод 1п1е гзес1 — оператор 3 является двухместным. Кроме того, обратите внимание, что можно было класс ИО11! бег назвать просто Зег, чтобы сделать это изменение более прозрачным, если бы в файле ао111ве1 в качестве имени наследуемого класса мы использовали полное имя ве1нгаррег. Яе1: »> ггоа ао111зе1 1арог1 * »> х = Иа1118е1([1,2,3,4]) »> у = Ио)118е1([3,4,5]) »> а = Иа)118е1([0, 1,2]) »>хау,х)у (Зег [3, 4], Зег:[1, 2, 3, 4, 5]) № Два операнда »> х.1п1егвес1(у, а) Зес:[] »> х.сп1оп(у, а) Зе1.[1, 2, 3, 4, 5, О] »> х.
1п1егзес1([1, 2. 3], [2, 3, 4], [1, 2, 3]) № Четыре операнда Зег: [2, 3] »> х.оп1оп(гап9е(!О)) Зег.[1, 2, 3, 4, О, 5, б, 7, 8, 9] № Три операнда № Даа операнда такие допустииы с1азз 1тзтог: Оеу герт (зе11); ге!ого (7<1пвгапсе оу Ив(%з), ассгевв Из:~пьв>" % (зе1(, с1авв , паве , № Иия коего класса ве1(.всрегв(), № Мои суперклассы тс(ве1(), № Мой адрес зе1(.аыгпааев()) ) № список паие=уа1ые сег а11гпааев(ве11); ...не изиенился.. Ое( всрегз(ве1(): гево11 = "" Г!ГВ1 = 1 Гог всрег 1п ве11. с1авв . Ьавев : № Вверх на один урозен> 6. Связи в дереве классов.
Ниже показано, как я изменил класс [1з(е г, и результат повторного запуска теста. Чтобы дополнительно отобразить унаследованные атрибуты, необходимо реализовать метод, аналогичный текущему методу а11гпааез, и предусмотреть в нем рекурсивный обход ссылок Ьазев в каждом классе. Поскольку, начиная с версии РуФ]юп 2.2, функция О[г включает в результат унаследованные атрибуты, можно было бы просто организовать цикл по ее результатам: например, Гог х 1п 01г(зе11) и использовать Оега11г(ве1[, х). Однако такой прием не поможет, если вам потребуется вывести структуру дерева классов (как в примере с[азв1гее.ру в главе 24]: Приложение В 1( пес (1гзс: гевц11 = гевц1с ь ", " (1гвС = 0 гезц1с = гезо1С ь ВЬРЕг. Паев ге!ого гевц11 № имя, не герт(зцрег) С:1руСПопхехаер1ев> руСПоп Сезве1х1п.ру <1пзсапсе ог Зць(Серег, ссзсег), аббгевв 7641200; паве бата3=42 паев бата2=еров паве ба(а)=ярам > с1азв Ьопсп: бет сп1С (ве)Г): № создать/встроить сцясоюег и еер)оуее ве1(.сцвс = сцвсоеег() ве1(.еер1 = Еер1оуее() бе( огбег(ве1(, (ообйаее): № начать имитацию офориления заказа ве1п сцвс.р1асеОгбег((ообйаее, ве1(.еер1) бе( гевц11(ве1(): № узнать у клиента название блюда ве1(.сцвт.ргспСЕооб() с1авв Сцжоеег Оет !псС (ве1(): № Ннициалиэировать блюдо значением Ноле ве!Е Гооб = йопе бес р1асеОгбег(ве1(, (ообйаее, еер1оуее): № Передать эакаэ официанту ве1(.гоаб = еер1оуее.сахеОгбег(гообиаее) бет рг1пСЕооб(ве!Г): № Вывести название блюда ргспС зе1(,тооб.паве с1авв Еер1оуее: бег сахеОгбег(ве1(, гоооиаее): № Вернут~ блюдо с требуем~и наэеаниеи геСцгп Еооб(сообйаее) с1авз Еооб: бес спсС (ВЕ1(, паве): ве1(.паев = паев № Сохранить название блюда сс паве == ' еасп х = СцпсЬ() х,огбег('Ьогг1Сов') х,гево!С() х.огбег('рсгга ) х.гевц1С() № Програииный код самопроверки № Если запускается как сценарии, № а не иилортируется как иодуль % руСПоп 1цпсП.ру ЬцггсСов остад 8.
Классификация лсиеотнык в зоологии. Ниже приводится мой способ реализации классификации животных на языке РуС)соп (файл 7. Композиция. Мое решение с комментариями, взятыми из описания, приводится ниже (файл 1илсЛру). Это один из случаев, когда свою мысль проще выразить на языке Ру()соп, чем на естественном языке: 815 Решения упражнений гоору); этот пример достаточно искусственный, но сам принцип применим ко многим реальным ситуациям, начиная от реализации графического интерфейса и заканчивая базами данных сотрудников.
Обратите внимание, что в классе Аптаа! выполняется обращение к методу зе1(. зреаК, это приводит к выполнению независимого поиска метода зреаК в дереве наследования, начиная с подкласса. Протестируйте работу этого дерева классов, следуя описанию упражнения. Попробуйте дополнить эту иерархию новыми классами и создать экземпляры различных классов в дереве: с1аы Ап1аа1: ое! гер1у(ве1!): зе1г.вреак() й Вызов негода подкласса Ое( зреаК(ве1!): рпп! 'враз' Ф Собственное сообщение с1азз Маааа1(Ап!аа1): Ое! возах(зе1!): рг(п! 'Ьипд' с1азв Сат(Маааа1): оег зреак(зе11) рг1п! 'аеощ' с1азв род(яаааа1): Ое! вреаК(ве1Г): рг!Ьт 'Ьагн' с1авв Рпаа!е(Маааа1): оег вреак(ве1!): рг!пт 'не11о иог1о!' с1авв наскег(Рг1аа1е): раы Л Наследует класс Рг1аасе 9.
Сценка с мертвым попугаем. Ниже приводится мое решение этого упражнения (файл рагго! ру). Обратите внимание на то, как работает метод 11пе в суперклассе Астог: он дважды обращается к атрибутам аргумента зе11, дважды отсылая интерпретатор к экземпляру, и тем самым дважды инициирует поиск в дереве наследования— зе1!. паве и зе1!. зауз(), с целью отыскать требуемую информацию в подклассах: с1ввз Ас!Ог; оег 1!пе(зе)г): ргтп! ве1(.паве + ':', герт(ве1(.заув()) с1аы сивтоаег(Астог): паве = 'сив!оаег' оег пауз(ве11); ге!игп чьа!'в опе ех-ь1гш с1азв С1егК(Астог): паве = 'с1егх' Ое! заув(зе1О ге!игп "по 1! 1вп'П .
с1азв Рагго!(Ас!ог): паве = 'рагго!' Ое! ваув(ве1!): гешгп Моле с1авз Зсепе; Ое! !Ь11 (зе1!): ве1(.с1егК = С1егх() Ф Встраивание некоторых зкзеипллрое зе1(.сиз!оаег = Сиз!оаег() Л Ясепе — это составной объект 816 Приложение В зе1Г,зоо)есс = Рагго(() бе( асг(оп(ве1(): ве1у.созтозег.