Пояснительная записка Элективный курс по информатике "Введение в объектноориентированное программирование на Python"
Скачать 0.85 Mb.
|
Функция help Еще более интересный способ получить информацию о модуле или его частях — это использование встроенной функции help. Она выводит текстовый отчет о переданном ей в качестве аргумента объекте. Этот отчет включает не только строки документации, но и структуру запрошенной части кода. т.е. применив функцию help по отношению к объектам мы получим еще и информацию о внутренних функциях и классах. Практическая работа 1. Напишите строки документации к программе, созданной на 7 уроке (вычисление площади оклеивания) . Поместите следующую информацию: o Модуль. Для чего предназначена данная программа. o Классы. Для чего предназначены, какие аргументы передаются методу __init__. o Методы (кроме __init__). Назначение, описание входных и выходных данных. 2. Используя метод __doc__, вызовите в интерактивном режиме строки документации для различных объектов модуля. Предварительно необходимо импортировать модуль (чтобы импортировать его без проблем, поместите файл в каталог установки python). 3. Примените функцию help для данного модуля. Например, если имя модуля rooms, то вызов справки по нему будет выглядеть так: help (rooms). Пример документированного исходного кода 1. "It is the program for definition of quantity of wall-paper" 2. 3. class Win_Door: 4. """ 5. Class Win_Door calculates the area of a rectangular. 6. Method __init__ accepts two parameters: length and width. 7. """ 8. def __init__ ( self ,x,y): 9. self .square = x * y 10. 11. class Room: 12. """ 13. Class Room is intended for definition of the pasted over area of a room. 14. Method __init__ accepts three arguments (length, width and height). 15. """ 16. def __init__ ( self ,x,y,z): 17. self .square = 2 * z * (x + y) 18. def win_door( self , d,e, f,g, m= 1 ,n= 1 ): 19. """ 20. The first pair parameters - the sizes of a window, 21. the second pair - the sizes of a door, 22. the fifth and sixth parameters - quantity of windows and doors accordingly 23. """ 24. self .window = Win_Door(d,e) 25. self .door = Win_Door(f,g) 26. self .numb_w = m 27. self .numb_d = n 28. def wallpapers( self ): 29. """ 30. This method calculates the pasted over area 31. """ 32. self .wallpapers = self .square - \ 33. self .window.square * self .numb_w \ 34. - self .door.square * self .numb_d 35. def printer( self ): 36. """ 37. Displays the information 38. """ 39. ( "Площадь стен комнаты равна " \ 40. , str ( self .square), " кв.м" ) 41. ( "Оклеиваемая площадь равна: " , \ 42. str ( self .wallpapers), " кв.м" ) Перегрузка операторов в ООП. Урок 10 Методическая разработка урока Элективный курс: Введение в объектно-ориентированное программирование на Python Уровень: Программирование для начинающих До этого мы говорили только о классах и объектах, которые создает программист (пользовательские классы). Однако Python настолько объектно-ориентированный язык, что в нем любые строка, число, список и др. являются по сути объектами, принадлежащими встроенным классам (типам данных): строкам, числам и др. Т. е. типы данных — это встроенные классы, а любые данные — это объекты. Объектно-ориентированное программирование подразумевает не только наличие объектов, но и их взаимодействие между собой. Поэтому важно, чтобы к объектам разных классов можно было применить одну и туже операцию (например, сложение). Для пользовательских классов предусмотрены специальные методы, позволяющие объектам данных классов участвовать в таких привычных операциях как сложение, вычитание, умножение, деление (+ - * /), а также во многих других. Другими словами, смысл (то, что он делает) знака + (или любого другого оператора) зависит от того, к каким объектам он применяется. Это называется перегрузкой операторов. В классах перегруженные операторы описываются с помощью специальных зарезервированных методов, которые в начале и в конце имеют по два знака подчеркивания. В уроке рассматриваются лишь некоторые из них. Кроме того, ранее был уже рассмотрен один такой метод — конструктор __init__, который автоматически вызывается при создании объектов класса. Рассмотрим пример перегрузки операторов. 1. class Newclass: 2. def __init__ ( self , base): 3. self .base = base 4. def __add__ ( self , a): 5. self .base = self .base + a 6. def __str__ ( self ): 7. return "%s !!! " % self .base 8. 9. a = Newclass(10) 10. a + 20 11. (a) 12. 13. b = Newclass( "yes" ) 14. b + "terday" 15. (b) 16. 17. c = Newclass([2,6,3]) 18. c + [7, 1] 19. (c) В данном примере используется два метода (исключая __init__) перегрузки операторов: __add__ и __str__. Метод __add__ вызывается в том случае, когда объект данного класса участвует в операции сложения (для чисел), конкатенации (для строк) и объединения (для списков). Метод __str__ вызывается, когда объект передается в качестве аргумента встроенной функции print (на самом деле не только ей) и представляет данные в виде строки. Результат работы скрипта представленного выше будет таким: 1. 30 !!! 2. yesterday !!! 3. [ 2 , 6 , 3 , 7 , 1 ] !!! Задание. Спешите пример, посмотрите как он работает. Дополните класс методами __mul__ (вызывается при использовании объекта в операциях умножения) и __sub__ (вычитание). Вызовите данные методы с помощью соответствующих операций с объектами. Для каких объектов невозможно использовать метод __sub__? __call__ - перегрузка вызова функции Метод __call__ автоматически вызывается, когда к объекту обращаются как к функции. Например, здесь во второй строке произойдет вызов метода __call__ некогоКласса: объект = некийКласс() объект(*возможные аргументы+) Другими словами, метод __call__ позволяет объектам вести себя как функции. Пример: 1. class Changeable: 2. def __init__ ( self , color): 3. self .color = color 4. def __call__ ( self , newcolor): 5. self .color = newcolor 6. def __str__ ( self ): 7. return "%s" % self .color 8. 9. canvas = Changeable( "green" ) 10. frame = Changeable( "blue" ) 11. 12. canvas( "red" ) 13. frame( "yellow" ) 14. 15. (canvas, frame) В этом примере с помощью конструктора класса при создании объектов устанавливается их цвет. Если требуется его поменять, то достаточно обратиться к объекту как к функции и в качестве аргумента передать новый цвет. Такой обращение автоматически вызовет метод __call__ (который, в данном случае, изменит атрибут color объекта). Задание. Создайте класс с методом __call__, принимающим два параметра и производящим над ними те или иные математические операции. Создайте несколько объектов класса и, затем, обратитесь к ним как к функциям. Рассмотренные в этом уроке методы перегрузки операторов лишь малая часть из существующих. Фактически все, что можно делать со встроенными типами (числами, словарями и др.), можно реализовать и для пользовательских типов (классов). Можно сказать, что перегрузка операторов обеспечивает единый интерфейс для встроенных и пользовательских типов (классов). Так, в первом примере можно видеть как "складываются" объект-число и объект класса Newclass. Особенности объектно-ориентированного программирования. Урок 11 Методическая разработка урока Элективный курс: Введение в объектно-ориентированное программирование на Python Уровень: Программирование для начинающих Общее представление об объектно-ориентированном программировании было рассмотрено на первом уроке. Здесь будет обобщение ранее рассмотренного материала и формулирование принципов, лежащих в основе ООП. Идеи (принципы) объектно-ориентированного программирования Во многих учебниках выделяют такие основные идеи ООП как наследование, инкапсуляция и полиморфизм. Заключаются они примерно в следующем: 1. наследование. Возможность выделять общие свойства и методы классов в один класс верхнего уровня (родительский). Классы, имеющие общего родителя, различаются между собой за счет включения в них различных дополнительных свойств и методов. 2. инкапсуляция. Свойства и методы класса делятся на доступные из вне (опубликованные) и недоступные (защищенные). Защищенные атрибуты нельзя изменить, находясь вне класса. Опубликованные же атрибуты также называют интерфейсом объекта, т. к. с их помощью с объектом можно взаимодействовать. По идеи, инкапсуляция призвана обеспечить надежность программы, т.к. изменить существенные для существования объекта атрибуты становится невозможно. 3. полиморфизм. Полиморфизм подразумевает замещение атрибутов, описанных ранее в других классах: имя атрибута остается прежним, а реализация уже другой. Полиморфизм позволяет специализировать (адаптировать) классы, оставляя при этом единый интерфейс взаимодействия. Преимущества ООП В связи со своими особенностями объектно-ориентированное программирование имеет ряд преимуществ перед структурным (и др.) программированием. Выделим некоторые из них: 1. Использование одного и того же программного кода с разными данными. Классы позволяют создавать множество объектов, каждый из которых имеет собственные значения атрибутов. Нет потребности вводить множество переменных, т.к объекты получают в свое распоряжение индивидуальные так называемые пространства имен. Пространство имен конкретного объекта формируется на основе класса, от которого он был создан, а также от всех родительских классов данного класса. Объект можно представить как некую упаковку данных. 2. Наследование и полиморфизм позволяют не писать новый код, а настраивать уже существующий, за счет добавления и переопределения атрибутов. Это ведет к сокращению объема исходного кода. Особенность ООП ООП позволяет сократить время на написание исходного кода, однако ООП всегда предполагает большую роль предварительного анализа предметной области, предварительного проектирования. От правильности решений на этом предварительном этапе зависит куда больше, чем от непосредственного написания исходного кода. Особенности ООП в Python По сравнению с другими распространенными языками программирования у Python можно выделить следующие особенности, связанные с объектно-ориентированным программированием: 1. Любое данное (значение) — это объект. Число, строка, список, массив и др. — все является объектом. Бываю объекты встроенных классов (как те, что перечисленные в предыдущем предложении), а бывают объекты пользовательских классов (тех, что создает программист). Для единого механизма взаимодействия предусмотрены методы перегрузки операторов. 2. Класс — это тоже объект с собственным пространством имен. Это нигде не было указано в данном цикле уроков. Однако это так. Поэтому правильнее было употреблять вместо слова «объект», слово «экземпляр». И говорить «экземпляр объекта», подразумевая под этим созданный на основе класса именно объект, и «экземпляр класса», имея ввиду сам класс как объект. 3. Инкапсуляции в Python не уделяется особого внимания. В других языках программирования обычно нельзя получить напрямую доступ к свойству, описанному в классе. Для его изменения может быть предусмотрен специальный метод. В Python же это легко сделать, просто обратившись к свойству класса из вне. Несмотря на это в Python все-таки предусмотрены специальные способы ограничения доступа к переменным в классе. Пример объектно-ориентированной программирования на языке Python. Урок 12 Методическая разработка урока Элективный курс: Введение в объектно-ориентированное программирование на Python Уровень: Программирование для начинающих В конце данного курса придумаем и напишем небольшую программу, используя объектно-ориентированную парадигму программирования. Как уже отмечалось в предыдущем уроке в ООП очень важен этап предварительного проектирования. Вообще можно выделить следующие этапы создании ОО-программы: 1. Формулирование задачи. 2. Определение объектов, участвующих в ее решении. 3. Проектирование классов, на основе которых будут созданы объекты, а также установление между ними иерархических связей. 4. Определение существенных свойств и методов для задач, которые будут решать объекты на основе проектируемых классов. 5. Создание классов, описание их свойств и атрибутов. 6. Создание объектов. 7. Решение задачи путем взаимодействия объектов. Первый этап: Допустим нам надо написать программу по «сценарию» описанному в уроке 1: про занятие, где ученики должны получить некий объем знаний. Второй этап: Какие объекты понадобятся? Очевидно, это ученики, учитель, информация, а также возможно вспомогательные предметы такие как проектор и др. Третий этап: Классы: учитель, ученик, информация. Учитель и ученик во многом похожи: по идеи оба - люди. Значит классы учитель и ученик могут принадлежать одному суперклассу - человек. Однако не все так просто. Если существенные признаки для решения данной задачи не имеют ничего общего, то выделить что-то в суперкласс просто невозможно. Четвертый этап: Выделим важное, чем должны обладать объекты (классы) для решения задачи «увеличить знания». Ученик должен уметь воспринимать информацию, и превращать ее в знания. Учитель, по крайней мере, должен уметь выбирать и транслировать информацию. Информация должна содержать определенный набор строк символов. Должна быть предусмотрена возможность извлечения ее частей. Пятый этап: Класс «Информация»: 1. class Information: 2. def __init__ ( self ,info): 3. self .info = info 4. def extract( self ,i): 5. self .current = self .info[i] 6. return "%s" % self .current Объекты данного класса при создании должны содержать ту или иную информацию (содержание урока), допустим в виде списка. В классе также предусмотрен метод extract, позволяющий извлекать какую-то часть информации и возвращать ее в основную программу. Класс «Учитель»: 1. class Teacher: 2. def into( self ,phrase): 3. self .phrase = phrase 4. def out( self ): 5. return "%s" % self .phrase Объектам типа «Учитель» в нашей программе позволено лишь вспоминать фразу и громко транслировать. Класс «Ученик»: 1. class Pupil: 2. def __init__ ( self ): 3. self .know = [] 4. def take( self , i): 5. self .know.append(i) Объекты класса Pupil уже при своем создании обязаны иметь атрибут know, куда будут помещаться знания. Также предусмотрен метод take, обеспечивающий приемку информации. Создание объектов: Допустим в программе будет по одному объекту «Информатика» и «Учитель» и пару объектов «Ученик». 1. inform = Information([ "> (больше)" , "< (меньше)" , "== (равно)" , "!= (не равно)" ]) 2. t = Teacher() 3. p1 = Pupil() 4. p2 = Pupil() Решение задачи с помощью взаимодействия объектов: Какая в данном случае задача? Научить учеников чему-нибудь. Приступим. 1. t.into(inform.extract(2)) 2. p1.take(t.out()) 3. ( "1-ый ученик пока еще знает только " , p1.know) 4. 5. t.into(inform.extract(0)) 6. p1.take(t.out()) 7. p2.take(t.out()) 8. ( "1-ый ученик знает, что " , p1.know) 9. ( "2-ой ученик знает, что " , p2.know) Учитель берет с помощью метода extract объекта inform часть информации. Ученики, используя свой метод take имеют возможность получить информацию, воспроизводимую учителем (метод out объекта t). В результате работы этой программы атрибут know учеников изменяется (если конечно те использовали метод take). Практическая работа 1. Напишите программу рассмотренную в этом уроке. Посмотрите как она работает. 2. Создайте еще пару учеников и еще один объект класса Information. Научите новых учеников чему-нибудь. 3. Может ли в данной программе ученик освоить информацию минуя учителя. Если «да», то реализуйте в программе «самостоятельную работу» ученика. |