Similar presentations:
Объектно-ориентированное программирование. Язык Python
1. Объектно-ориентированное программирование. Язык Python
1Объектно-ориентированное
программирование.
Язык Python
§ 42. Введение
§ 43. Создание объектов в программе
§ 44. Скрытие внутреннего устройства
§ 45. Иерархия классов
§ 46. Программы с графическим интерфейсом
§ 47. Графические интерфейс: основы
§ 48. Использование компонентов
§ 49. Совершенствование компонентов
§ 50. Модель и представление
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
2. Объектно-ориентированное программирование. Язык Python
2Объектноориентированное
программирование.
Язык Python
§ 45. Иерархия классов
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
3. Классификации
Объектно-ориентированное программирование. Язык Python. 11 класс3
Классификации
? Что такое классификация?
Классификация – разделение изучаемых объектов на
группы (классы), объединенные общими признаками.
? Зачем это нужно?
Фрукт
Яблоко
Груша
базовый класс
Банан
Апельсин
классынаследники
это фрукт,
у которого…
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
4. Что такое наследование?
Объектно-ориентированное программирование. Язык Python. 11 класс4
Что такое наследование?
класс Двудольные
семейство Бобовые
род Клевер
горный клевер
наследует свойства
(имеет все свойства)
Класс Б является наследником класса А, если можно
сказать, что Б – это разновидность А.
яблоко – фрукт
яблоко – это фрукт
горный клевер – клевер
горный клевер – это
растение рода Клевер
машина – двигатель
машина содержит
двигатель (часть – целое)
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
5. Иерархия логических элементов
Объектно-ориентированное программирование. Язык Python. 11 класс5
Иерархия логических элементов
Логический элемент
с одним входом
с двумя входами
И
НЕ
A
A
A
B
&
ИЛИ
A B
A
B
1
A B
Объектно-ориентированное программирование –
это такой подход к программированию, при котором
программа представляет собой множество
взаимодействующих объектов, каждый из которых
является экземпляром определенного класса, а
классы образуют иерархию наследования.
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
6. Базовый класс
Объектно-ориентированное программирование. Язык Python. 11 класс6
Базовый класс
ЛогЭлемент
In1 (вход 1)
In2 (вход 2)
Res (результат)
calc
class TLogElement:
def __init__ ( self ):
self.__in1 = 0
self.__in2 = 0
self._res = 0
? Зачем хранить результат?
поле доступно
наследникам!
можно моделировать элементы
с памятью (триггеры)
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
7. Базовый класс
Объектно-ориентированное программирование. Язык Python. 11 класс7
Базовый класс
class TLogElement:
def __init__( self ):
self.__in1 = 0
self.__in2 = 0
self._res = 0
def __setIn1 ( self, newIn1 ):
self.__in1 = newIn1
пересчёт выхода
self.calc()
def __setIn2 ( self, newIn2 ):
self.__in2 = newIn2
self.calc()
In1 = property (lambda x: x.__in1, __setIn1)
In2 = property (lambda x: x.__in2, __setIn2)
Res = property (lambda x: x._res )
только для
чтения
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
8. Метод calc
Объектно-ориентированное программирование. Язык Python. 11 класс8
Метод calc
? Как написать метод calc?
class TLogElement:
...
def calc ( self ):
pass
заглушка
! Нужно запретить создавать объекты TLogElement!
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
9. Абстрактный класс
Объектно-ориентированное программирование. Язык Python. 11 класс9
Абстрактный класс
• все логические элементы должны иметь метод calc
• метод calc невозможно написать, пока неизвестен тип
логического элемента
Абстрактный метод – это метод класса, который
объявляется, но не реализуется в классе.
Абстрактный класс – это класс, содержащий хотя бы
один абстрактный метод.
нет логического элемента «вообще», как не «фрукта
вообще», есть конкретные виды
! Нельзя создать объект абстрактного класса!
TLogElement – абстрактный класс из-за метода calc
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
10. Абстрактный класс
Объектно-ориентированное программирование. Язык Python. 11 класс10
Абстрактный класс
? Как запретить создание объекта?
class TLogElement:
def __init__ ( self ):
self.__in1 = 0
если у объекта нет
self.__in2 = 0
атрибута (поля или
метода) с именем calc…
self._res = 0
if not hasattr ( self, "calc" ):
raise NotImplementedError(
"Нельзя создать такой объект!")
создать («поднять»,
«выбросить»)
исключение
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
11. Что такое полиморфизм?
Объектно-ориентированное программирование. Язык Python. 11 класс11
Что такое полиморфизм?
class TLogElement:
def __init__( self ):
...
def __setIn1 ( self, newIn1 ):
self.__in1 = newIn1
self.calc()
для каждого наследника
вызывается свой метод
calc
Полиморфизм – это возможность классов-наследников
по-разному реализовать метод с одним и тем же
именем.
греч.: πολυ — много, μορφη — форма
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
12. Элемент «НЕ»
Объектно-ориентированное программирование. Язык Python. 11 класс12
Элемент «НЕ»
наследник от
TLogElement
A
A
class TNot ( TLogElement ):
def __init__ ( self ):
TLogElement.__init__ ( self )
def calc ( self ):
self._res = 1 - self.In1
? Почему не __in1?
вызов
конструктора
базового класса
! Это уже не абстрактный класс!
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
13. Элемент «НЕ»
Объектно-ориентированное программирование. Язык Python. 11 класс13
Элемент «НЕ»
Использование:
n = TNot()
n.In1 = 0
создание объекта
установка входа
print ( n.Res )
К.Ю. Поляков, Е.А. Ерёмин, 2018
вывод результата
http://kpolyakov.spb.ru
14. Элементы с двумя входами
Объектно-ориентированное программирование. Язык Python. 11 класс14
Элементы с двумя входами
наследник от
TLogElement
class TLog2In ( TLogElement ):
pass
? Можно ли создать объект этого класса?
нельзя, он абстрактный
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
15. Элементы с двумя входами
Объектно-ориентированное программирование. Язык Python. 11 класс15
Элементы с двумя входами
A
Элемент «И»:
& A B
B
class TAnd ( TLog2In ):
def __init__ ( self ):
TLog2In.__init__ ( self )
def calc ( self ):
self._res = self.In1 and self.In2
A
Элемент «ИЛИ»:
1 A B
B
class TOr ( TLog2In ):
def __init__ ( self ):
TLog2In.__init__ ( self )
def calc ( self ):
self._res = self.In1 or self.In2
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
16. Пример: элемент «И-НЕ»
Объектно-ориентированное программирование. Язык Python. 11 класс16
Пример: элемент «И-НЕ»
elAnd
elNot = TNot()
elAnd = TAnd()
elAnd.In1 = 0
elAnd.In2 = 1
elNot
A
B
&
elNot.In1 = elAnd.Res
print ( elNot.Res )
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
17. Таблица истинности элемента «И-НЕ»
Объектно-ориентированное программирование. Язык Python. 11 класс17
Таблица истинности элемента «И-НЕ»
elNot = TNot()
elAnd = TAnd()
print ( " A | B | not(A&B) " );
print ( "-------------------" );
for A in [0,1]:
A
&
elAnd.In1 = A
B
for B in [0,1]:
elAnd.In2 = B
elNot.In1 = elAnd.Res
print ( " ", A, "|", B, "|", elNot.Res )
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
18. Модульность
Объектно-ориентированное программирование. Язык Python. 11 класс18
Модульность
Идея: выделить классы в отдельный модуль
logelement.py.
class TLogElement:
...
class TNot ( TlogElement ):
...
class TLog2In ( TLogElement ):
pass
class TAnd ( TLog2In ):
...
class TOr ( TLog2In ):
...
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
19. Модульность
Объектно-ориентированное программирование. Язык Python. 11 класс19
Модульность
В основную программу:
import logelement
elNot = logelement.TNot()
elAnd = logelement.TAnd()
...
from logelement import *
elNot = TNot()
elAnd = TAnd()
...
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
20. Сообщения между объектами
Объектно-ориентированное программирование. Язык Python. 11 класс23
Задание
«A»: Собрать полную программу и построить таблицу
истинности последовательного соединения элементов
«ИЛИ» и «НЕ».
Пример:
A | B | not(A+B)
------------------0 | 0 | 1
0 | 1 | 0
1 | 0 | 0
1 | 1 | 0
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
21. Сообщения между объектами
Объектно-ориентированное программирование. Язык Python. 11 класс24
Задание
«B»: Добавить в иерархию классов элементы «И-НЕ» (TNAnd)
и «ИЛИ-НЕ» (TNOr), которые представляют собой
последовательные соединения элементов «И» и «ИЛИ» с
элементом «НЕ». Построить их таблицы истинности.
Пример:
A | B | A nand B
------------------0 | 0 | 1
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
A | B | A nor B
------------------0 | 0 | 1
0 | 1 | 0
1 | 0 | 0
1 | 1 | 0
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
22. Сообщения между объектами
Объектно-ориентированное программирование. Язык Python. 11 класс25
Задание
«C»: Добавить в иерархию классов элемент «исключающее
ИЛИ» (TXor) и «импликация» (TImp). Построить их
таблицы истинности.
Пример:
A | B | A xor B
------------------0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
A | B | A -> B
------------------0 | 0 | 1
0 | 1 | 1
1 | 0 | 0
1 | 1 | 1
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
23. Задание
Объектно-ориентированное программирование. Язык Python. 11 класс26
Задание
«D»: Добавить в иерархию классов элемент «триггер»
(TTrigger). Построить его таблицу истинности при
начальных значениях выхода Q, равных 0 и 1.
Пример:
При Q = 0:
A | B | Q
------------------0 | 0 | 0
0 | 1 | 0
1 | 0 | 1
1 | 1 | 1
При Q = 1:
A | B | Q
------------------0 | 0 | 1
0 | 1 | 0
1 | 0 | 1
1 | 1 | 1
К.Ю. Поляков, Е.А. Ерёмин, 2018
http://kpolyakov.spb.ru
programming