Объектно-ориентированное программирование. Язык Python
Объектно-ориентированное программирование. Язык Python
Классификации
Что такое наследование?
Иерархия логических элементов
Базовый класс
Базовый класс
Метод calc
Абстрактный класс
Абстрактный класс
Что такое полиморфизм?
Элемент «НЕ»
Элемент «НЕ»
Элементы с двумя входами
Элементы с двумя входами
Пример: элемент «И-НЕ»
Таблица истинности элемента «И-НЕ»
Модульность
Модульность
Сообщения между объектами
Сообщения между объектами
Сообщения между объектами
Задание
660.50K
Category: programmingprogramming

Объектно-ориентированное программирование. Язык 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
English     Русский Rules