Устройство памяти в Python
Управление памятью
Ручное управление памятью
Ручное управление памятью
Автоматическое управление памятью
Механизм памяти в Python
Механизм памяти в Python
Механизм памяти в Python
Механизм памяти в Python
Механизм памяти в Python
Механизм памяти в Python
Блок
Блок
Пул
Пул
Пул
Пул
Пул
Пул
Пул
Арена
Арена
Арена
Арена
Примечания
Переменные в Python
Переменные в C и C++
Переменные в C и C++
Переменные в C и C++
Переменные в C и C++
Переменные в Python
Переменные в Python
Переменные в Python
Переменные в Python
Переменные в Python
Переменные в Python
Переменные в Python
Объектно-ориентированное программирование. Язык Python
Объект в Python
Объект в Python
Объект в Python
Объект в Python
Идентификатор объекта
Идентификатор объекта
Идентификатор объекта
Идентификатор объекта
Тип объекта
Изменяемые и неизменяемые типы данных
Изменяемые и неизменяемые типы данных
Изменяемые и неизменяемые типы данных
Изменяемые и неизменяемые типы данных
Пример 1:
Пример 2:
Изменяемые и неизменяемые типы данных
Функции как объекты
Пример:
Стек
Стек
Стек вызовов функции
Объектно-ориентированное программирование. Язык Python
Пространства имен в Python (namespace)
Встроенное пространство имен (builtins)
Глобальное пространство имен (global)
Локальное (local) и объемлющее (enclosing) пространства имен 
Локальное и объемлющее пространства имен 
Область видимости переменной  
Область видимости переменной  
Область видимости переменной  
Объектно-ориентированное программирование. Язык Python
Класс в Python
Класс в Python
Класс в Python
Синтаксис определения класса в Python
Свойства (атрибуты) класса
Свойства (атрибуты) класса
Методы класса
Методы класса
Методы класса
Методы класса
Конструктор
Действия над объектами, созданными с помощью конструктора
Конструктор
Конструктор
Конструктор с параметрами
Класс в Python
Пример:
Пример:
Пример:
Пример:
Объектно-ориентированное программирование. Язык Python
Принципы ООП. Абстракция
Принципы ООП. Инкапсуляция
Принципы ООП. Инкапсуляция
Модификаторы доступа в ООП
Модификаторы доступа в ООП
Модификаторы доступа в ООП
Модификаторы доступа в ООП
Модификаторы доступа в ООП
Модификаторы доступа в ООП
Принципы ООП. Наследование
Принципы ООП. Наследование
Принципы ООП. Наследование
Принципы ООП. Наследование
Принципы ООП. Наследование
Наследование в Python. Синтаксис.
Наследование в Python. Синтаксис.
Переопределение атрибутов
Переопределение атрибутов
Переопределение атрибутов
Многоуровневое наследование
Многоуровневое наследование
Многоуровневое наследование
Многоуровневое наследование
Многоуровневое наследование
Многоуровневое наследование
Многоуровневое наследование
Наследование в Python.
Наследование в Python.
Множественное наследование
Пример множественного наследования
Полиморфизм
Пример полиморфизма
Полиморфизм
Полиморфизм
8.56M
Category: programmingprogramming

Устройство памяти в Python

1. Устройство памяти в Python

1
Устройство памяти в
Python
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

2. Управление памятью

Объектно-ориентированное программирование. Язык Python. 11 класс
2
Управление памятью
Управление памятью — это процесс
выделения, распределения и координации
памяти таким образом, чтобы все программы
работали правильно и могли оптимально
получать доступ к различным системным
ресурсам.
Управление памятью также включает в себя
и очистку памяти от объектов, которые больше не
нужны.
Типы управления памятью:
ручное
автоматическое
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

3. Ручное управление памятью

Объектно-ориентированное программирование. Язык Python. 11 класс
3
Ручное управление памятью
Ручное управление памятью включает в
себя, как правило, три этапа:
запрос памяти у операционной системы
работа с ней
возвращение
памяти
обратно
в
операционную систему
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

4. Ручное управление памятью

Объектно-ориентированное программирование. Язык Python. 11 класс
4
Ручное управление памятью
Преимущества:
Ручной
подход
управления
позволяет
работать с памятью максимально эффективно.
Точно известно, сколько памяти выделено, зачем
мы ее используем, и т.д.
Недостатки:
Сложность. Управлять памятью вручную —
сложно и тяжело, поскольку если не вернуть
память
обратно
операционной
системе,
возникает
утечка:
программа
держит
неиспользуемую память, не дает применять ее
для решения других задач.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

5. Автоматическое управление памятью

Объектно-ориентированное программирование. Язык Python. 11 класс
Автоматическое управление памятью
Автоматическое управление памятью берет
на себя самый сложный этап — возвращение
памяти обратно операционной системе, когда она
уже не требуется.
Восстановленная
память
может
использоваться другими объектами. Это немного
менее эффективно, но позволяет сократить
трудозатраты на управление памятью и повысить
надежность этого процесса.
К языкам с ручным управлением памяти
относятся: C, C++, Pascal и др.
К языкам с автоматическим управлением
памяти относятся: Python, C#, Java, Ruby,
JavaScript и др.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
5

6. Механизм памяти в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
6
Механизм памяти в Python
Для управления памятью Python использует
несколько механизмов.
При запуске Python программы создается
новый
процесс,
в
рамках
которого
операционная система выделяет пул ресурсов,
включая виртуальное адресное пространство.
В эту память загружается интерпретатор
Python вместе со всеми необходимыми ему для
работы данными, включая код программы.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

7. Механизм памяти в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
7
Механизм памяти в Python
Оставшаяся свободная виртуальная память
используется для хранения Python объектов.
Для управления этой памятью в Python
используется специальный механизм, который
называется аллокатор. Он используется каждый
раз, когда нам нужно создать новый объект.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

8. Механизм памяти в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
Механизм памяти в Python
Обычно
в
программах
не
оперируют
большими объектами. Числа, строки и т.д.,
занимают не большой объем в расчёте на одно
значение. Но создаются они часто. И это
приводило бы к проблемам, если бы Python все
такие вызовы транслировал в операционную
систему. Системный вызов на выделение памяти
— трудозатратен, зачастую связан с переходом в
контекст ядра операционной системы.
Поэтому одна из главных задач аллокатора
Python — оптимизация количества системных
вызовов.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru
8

9. Механизм памяти в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
9
Механизм памяти в Python
Для больших объектов (больше 512 байт)
Python выделяет память напрямую у ОС.
Обычно таких объектов не очень много в
рамках программы, и создаются они нечасто.
Поэтому расходы на создание таких объектов
напрямую в оперативную память не высоки.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

10. Механизм памяти в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
10
Механизм памяти в Python
Аллокатор для малых объектов (не
больше 512 байт) использует три уровня
абстракции:
блок — кусок памяти, используемый для
хранения одного объекта
пул — кусок памяти, содержащий блоки
(обычно одна страница виртуальной памяти)
арена — большой непрерывный кусок
памяти,
содержащий
пулы
(обычно
содержит несколько страниц виртуальной
памяти)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

11. Механизм памяти в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
11
Механизм памяти в Python
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

12. Блок

Объектно-ориентированное программирование. Язык Python. 11 класс
12
Блок
Блок — это кусок памяти, который может
содержать
только
один
Python
объект
фиксированного размера.
Размер
блока
может
варьироваться
от 8 до 512 байт и должен быть кратен восьми.
Все блоки в конкретном пуле имеют
одинаковый размер и находятся в одном классе
размера, который и определяет размер блока.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

13. Блок

Объектно-ориентированное программирование. Язык Python. 11 класс
13
Блок
Градация блоков:
Запрос
Размер блока в
памяти в байтах байтах
1-8
8
9-16
16
17-24
24
25-32
32
33-40
40
41-48
48
...
...
505-512
512
К.Ю. Поляков, Е.А. Ерёмин, 2014
Индекс класса
размера
0
1
2
3
4
5
...
63
http://kpolyakov.spb.ru

14. Пул

Объектно-ориентированное программирование. Язык Python. 11 класс
14
Пул
Пулы состоят из блоков одного размера.
Каждый
пул
работает
по
принципу
двухсвязного списка с другими пулами того же
размера.
Ограничение пула фиксированным размером
блоков помогает с фрагментацией. Если объект
уничтожается, аллокатор может заполнить это
пространство новым объектом того же размера.
Поэтому алгоритм может с легкостью найти
необходимое место для требуемого размера
блока даже среди множества пулов.
Размер пула равен 4 килобайта.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

15. Пул

Объектно-ориентированное программирование. Язык Python. 11 класс
15
Пул
Для эффективного управления пулами
Python использует дополнительный список,
который называется usedpools. Он хранит
указатели на пулы, сгруппированные по классам.
Все пулы с одинаковым размером блока
связаны между собой. Чтобы перебрать их,
нужно знать начало списка.
Если пулов такого размера нет, то при
первом запросе памяти будет создан новый пул.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

16. Пул

Объектно-ориентированное программирование. Язык Python. 11 класс
16
Пул
usedpools
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

17. Пул

Объектно-ориентированное программирование. Язык Python. 11 класс
17
Пул
Пулы находятся в трех состояниях:
используемый
(used)

частично
заполненный, какие-то блоки заняты,
какие-то свободны
полный (full) — полностью заполненный,
все блоки заняты
пустой (empty) — все блоки свободны и
доступны для записи (хранятся в списке
пустых пулов freepools)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

18. Пул

Объектно-ориентированное программирование. Язык Python. 11 класс
18
Пул
Используемый пул содержит блоки, в
которые можно записать какую-то информацию.
Блоки полного пула все распределены и
уже содержат данные.
Пустые пулы не содержат данных и могут
быть разбиты на какие угодны классы размера
при необходимости.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

19. Пул

Объектно-ориентированное программирование. Язык Python. 11 класс
19
Пул
Например:
Коду необходимо 8 байт.
Если в списке используемых пулов нет пулов с
классом размера в 8 байт, то новый пустой пул
инициализируется, как хранящий блоки по 8 байт.
Затем пустой пул добавляется в список
используемых пулов и может быть использован при
следующих запросах.
Заполненный пул освобождает некоторые блоки,
когда эта информация в них уже не нужна. Этот пул
добавится в список используемых в соответствии со
своим классом размера.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

20. Пул

Объектно-ориентированное программирование. Язык Python. 11 класс
20
Пул
usedpools
freepools
Пустой блок
Занятый
блок
!
Пулы и блоки не выделяют память напрямую, они
используют уже выделенное пространство в аренах.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

21. Арена

Объектно-ориентированное программирование. Язык Python. 11 класс
21
Арена
Арена – это кусок памяти размером в 256
килобайт, который обеспечивает память для 64
пулов.
Arena
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

22. Арена

Объектно-ориентированное программирование. Язык Python. 11 класс
22
Арена
Арены, в отличие от пулов, не имеют явных
разделений на состояния.
Они сами по себе организованы в
двухсвязный список usable_arenas.
Этот список отсортирован по количеству
свободных пулов. Чем меньше свободных пулов,
тем ближе арена к началу списка.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

23. Арена

Объектно-ориентированное программирование. Язык Python. 11 класс
23
Арена
usable_arenas
nfreepools = 0
К.Ю. Поляков, Е.А. Ерёмин, 2014
nfreepools = 1
nfreepools = 2
http://kpolyakov.spb.ru

24. Арена

Объектно-ориентированное программирование. Язык Python. 11 класс
24
Арена
Наиболее полная арена будет выбрана для
записи еще большего количества данных. Такое
расположение арен позволяет снизить объем
потребляемой
программой
памяти.
При полном освобождении памяти Python
возвращает память в пользование операционной
системе.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

25. Примечания

Объектно-ориентированное программирование. Язык Python. 11 класс
25
Примечания
Примечание
1.
Все
вышесказанное
относится к эталонной реализации Python,
которая
называется
CPython.
В
других
реализациях аллокатор может иметь отличия.
Примечание
2.
Языки
с
ручным
управлением памятью работают гораздо быстрее
языков с автоматическим управлением памятью.
Это цена, которую приходится платить за
простоту написания программ.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

26. Переменные в Python

26
Переменные в Python
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

27. Переменные в C и C++

Объектно-ориентированное программирование. Язык Python. 11 класс
27
Переменные в C и C++
Например
код,
переменную num:
который
определяет
int num = 101;
Исполнение этой строки кода проходит через
несколько этапов:
выделение
достаточного
количества
памяти для числа;
присвоение этому месту в памяти
значения 101;
отображение, что num указывает на это
значение.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

28. Переменные в C и C++

Объектно-ориентированное программирование. Язык Python. 11 класс
28
Переменные в C и C++
Упрощённо
память
может выглядеть так:
Здесь переменная num имеет виртуальный
адрес 0x7f1 и значение 101. Если позднее нам
захочется изменить значение num, это можно
сделать так:
num = 102;
Этот код присваивает переменной num новое
значение 102, перезаписывая предыдущее
значение. Это означает, что переменная
num изменяема.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

29. Переменные в C и C++

Объектно-ориентированное программирование. Язык Python. 11 класс
29
Переменные в C и C++
Обновлённая
памяти
для
значения:
схема
нового
Расположение num в памяти не поменялось,
поменялось только само значение. Это говорит
о том, что num — это место в памяти, а не
просто имя.
Можно сказать, что переменная num
владеет местом в памяти. По сути, num — это
пустая коробка, которая может содержать лишь
одно целое число (тип int).
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

30. Переменные в C и C++

Объектно-ориентированное программирование. Язык Python. 11 класс
30
Переменные в C и C++
При этом создать новую переменную num1
можно следующим образом:
int num1 = num;
Этот код создаёт новую коробку под
названием num1 и копирует в неё значение
из num. Теперь схема памяти выглядит так:
!
Местоположение num1 — 0x7f5. Хотя в num1 и было
скопировано значение num, однако переменная num1
владеет
новым
адресом в памяти.
К.Ю. Поляков,
Е.А. Ерёмин,
2014
http://kpolyakov.spb.ru

31. Переменные в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
31
Переменные в Python
В Python нет переменных, как таковых, вместо
них имена. Можно использовать термин
переменные, однако важно понимать разницу
между переменными и именами.
Возьмём эквивалентный код из примера на
С(С++) и напишем его на Python:
num = 101
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

32. Переменные в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
32
Переменные в Python
Исполнение этой строки кода проходит через
несколько этапов:
создаётся специальный объект PyObject
заполняется его поле Type, которое
указывает на тип
заполняется его поле Value, которое
указывает на значение
создаётся имя num
имя num начинает указывать на созданный
PyObject
счётчик ссылок (поле Reference Count)
объекта PyObject увеличивается на 1
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

33. Переменные в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
33
Переменные в Python
Память может выглядеть таким образом:
Схема памяти в Python отличается от схемы в
С (С++). Вместо того чтобы num владел блоком
памяти, в котором хранится значение 101, этой
памятью владеет объект PyObject.
Таким образом, в Python имя num не владеет
напрямую каким-либо адресом в памяти.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

34. Переменные в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
34
Переменные в Python
Для присвоения нового
используем следующий код:
значения
имени
num
num = 101
num = 102
Исполнение второй строки кода проходит через
несколько этапов:
создаётся новый PyObject
заполняется его поле Type, которое указывает на тип
заполняется его поле Value, которое указывает на
значение
имя num указывает на новый PyObject
счётчик ссылок (поле Reference Count) нового
PyObject увеличивается на 1
счётчик ссылок (поле Reference Count) старого
PyObject уменьшается на 1
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

35. Переменные в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
35
Переменные в Python
Теперь схема памяти выглядит так:
В Python мы не
! присваиваем
!
переменные, а
привязываем имена к
объектам.
Предыдущий PyObject теперь находится в памяти со
счётчиком ссылок, равным 0, и подлежит удалению с
помощью сборщика мусора
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

36. Переменные в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
36
Переменные в Python
Мы можем ввести новое имя num1:
num = 101
num = 102
num1 = num
!
В памяти появится новое имя num1, но не новый
объект!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

37. Переменные в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
37
Переменные в Python
Теперь схема памяти выглядит так:
!
Новый PyObject не создан, создано только новое
имя, которое указывает на имеющийся объект,
счётчик ссылок которого увеличился на 1.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

38. Объектно-ориентированное программирование. Язык Python

38
Объектноориентированное
программирование.
Язык Python
Объект в Python.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

39. Объект в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
39
Объект в Python
​В языке Python все объект: число, строка,
список, кортеж, множество, словарь, даже
функция
Данные – это объекты и отношения между ними
Данные
a=1
b=2
c = [a, b]
Объект – это «контейнер»
в памяти, который
К.Ю. Поляков, Е.А.
Ерёмин, 2014 данные
содержит
Объект
1
[ . ,
Память
2
.]
Объект
Отношение
между
объектами
http://kpolyakov.spb.ru

40. Объект в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
40
Объект в Python
​Объекты в языке Python предоставляют
универсальный способ хранения данных в
памяти
Объекты отличаются друг от друга.
не может
Любой объект имеет:
измениться с
• Идентификатор;
момента
• Тип;
создания
объекта
• Значение
! Идентификатор позволяет отличить один
объект от другого. Гарантируется что никакие
два объекта в один момент времени не
обладают одинаковым идентификатором.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

41. Объект в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
41
Объект в Python
х
«ссылается»
на объект 4
!
Оператор присваивания запоминает за
именем переменной из левой части
идентификатор объекта из правой части
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

42. Объект в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
42
Объект в Python
x
1
y
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

43. Идентификатор объекта

Объектно-ориентированное программирование. Язык Python. 11 класс
43
Идентификатор объекта
Идентификатор объекта – это целое и
постоянное число, которое никогда не изменяется
после его создания.
В стандартной реализации Python (CPython)
идентификатор объекта ассоциируется с адресом
объекта в памяти.
Для того чтобы получить идентификатор
объекта, используется встроенная функция id().
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

44. Идентификатор объекта

Объектно-ориентированное программирование. Язык Python. 11 класс
44
Идентификатор объекта
Приведенный ниже код:
name = 'Timur'
age = 29
Получили идентификаторы
!
is_teacher = True
объектов,
созданных в разное время.
print(id(name))
Они не равны!
print(id(age))
print(id(is_teacher))
может выводить:
2017717924208
2017661682800
140729045662568
К.Ю. Поляков, Е.А. Ерёмин, 2014
При каждом новом запуске
! программы
идентификаторы
будут разные.
http://kpolyakov.spb.ru

45. Идентификатор объекта

Объектно-ориентированное программирование. Язык Python. 11 класс
45
Идентификатор объекта
​Определить ссылаются ли переменные на один
и тот же объект можно при помощи оператора is:
x = [1, 2, 3]
y = x
y is x
# True
y is [1, 2, 3]
# False
Если
какая-либо
другая
переменная
указывает на объект, который мы изменили,
эта переменная также отразит это изменение,
но не потому что изменилась переменная, а
потому что изменился объект, на который она
ссылается.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

46. Идентификатор объекта

Объектно-ориентированное программирование. Язык Python. 11 класс
46
Идентификатор объекта
!
x
Изменяется объект, а не
переменная!
[ 1 , 2, 3,
3 ]4 ]
y
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

47. Тип объекта

Объектно-ориентированное программирование. Язык Python. 11 класс
47
Тип объекта
Тип объекта определяет:
• действия над объектом, «поведение» объекта
• возможные принимаемые значения объекта
!
К.Ю. Поляков, Е.А. Ерёмин, 2014
Все в Python - объект!
http://kpolyakov.spb.ru

48. Изменяемые и неизменяемые типы данных

Объектно-ориентированное программирование. Язык Python. 11 класс
48
Изменяемые и неизменяемые типы данных
Важно понимать какие значения могут принимать объекты
того или иного типа.
Immutable object – неизменяемый объект
Mutable object– объект, который может изменить свое
значение в течение жизни
! Числа - не изменяемые объекты
Данные
Память
5
a=5
b=6
a=a+b
a
6
b
11
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

49. Изменяемые и неизменяемые типы данных

Объектно-ориентированное программирование. Язык Python. 11 класс
49
Изменяемые и неизменяемые типы данных
Например:
data = 'beegeek'
data[0] = 'B'
print(data)
? Что получим?
Результат:
TypeError: 'str' object does not support item assignment
(тип str) являются
! Строки
неизменяемыми
К.Ю. Поляков, Е.А. Ерёмин, 2014
? Почему?
http://kpolyakov.spb.ru

50. Изменяемые и неизменяемые типы данных

Объектно-ориентированное программирование. Язык Python. 11 класс
50
Изменяемые и неизменяемые типы данных
Все строковые методы возвращают новые объекты, а
не изменяют исходные.
Аналогичным образом работают методы других
неизменяемых типов данных.
a = 'beegeek'
b = a.upper() + a.lower()
? Сколько Python объектов будет создано
во время выполнения приведенного
кода?
Будет создано 4
PyObject
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

51. Изменяемые и неизменяемые типы данных

Объектно-ориентированное программирование. Язык Python. 11 класс
51
Изменяемые и неизменяемые типы данных
Возможность объекта изменять свои значения зависит от
типа объекта:
Immutable object
int
list
float
dict
К.Ю. Поляков, Е.А. Ерёмин, 2014
Mutable object
bool
complex
set
tuple
str
frozenset
http://kpolyakov.spb.ru

52. Пример 1:

Объектно-ориентированное программирование. Язык Python. 11 класс
52
Изменяемые и неизменяемые типы данных
Пример 1:
nums = [1, 2, 3]
print(nums)
print(id(nums))
nums = [1, 2, 3] + [4]
print(nums)
print(id(nums))
Результат:
[1, 2, 3]
2130653012352
[1, 2, 3, 4]
2130653007680
К.Ю. Поляков, Е.А. Ерёмин, 2014
! Не изменяем
исходный список, а
создаем новый и
присваиваем
его прежней
переменной.
! Данный код всегда
выводит различные
идентификаторы!
http://kpolyakov.spb.ru

53. Пример 2:

Объектно-ориентированное программирование. Язык Python. 11 класс
53
Изменяемые и неизменяемые типы данных
Пример 2:
nums = [1, 2, 3]
print(id(nums))
print(nums)
nums.append(4)
print(id(nums))
print(nums)
Результат:
2675065348480
[1, 2, 3]
2675065348480
[1, 2, 3, 4]
К.Ю. Поляков, Е.А. Ерёмин, 2014
создаем
! Единожды
список, а после
изменяем его,
добавляя в него
новый элемент.
! Данный код всегда
выводит равные
идентификаторы!
http://kpolyakov.spb.ru

54. Изменяемые и неизменяемые типы данных

Объектно-ориентированное программирование. Язык Python. 11 класс
54
Изменяемые и неизменяемые типы данных
Пример 3:
x = [1, 2, 3]
y = x
? Что получим?
y.append(4)
s = "123"
t = s
t = t + "4"
print(str(x) + " " + s)
Результат:
[1, 2, 3, 4] 123
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

55. Функции как объекты

Объектно-ориентированное программирование. Язык Python. 11 класс
55
Функции как объекты
Функции в языке Python являются объектами.
10
function_name:
argument1
argument2
тело функции
2
8
! При каждом вызове функции Python
инициализирует аргументы заново!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

56. Пример:

Объектно-ориентированное программирование. Язык Python. 11 класс
56
Пример:
a = []
def foo(arg1, arg2):
a.append("foo")
foo(a.append("arg1"), a.append("arg2"))
print(a)
? Что получим?
a) ['arg1', 'arg2', 'foo']
b) ['foo', 'arg1', 'arg2']
c) ['foo']
d) Код некорректен
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

57. Стек

Объектно-ориентированное программирование. Язык Python. 11 класс
57
Стек
Важной концепцией в области исполнения кода и
вызова функции является стек (машинный стек, стек
исполнения, стек вызовов ).
Стек — это структура данных, в которой элементы
хранятся в порядке поступления. Его еще часто
называют LIFO (Last-In/First-Out). Это отличает его от
очереди, в которой элементы хранятся в порядке
«первым пришел / первым обслужен» (FIFO).
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

58. Стек

Объектно-ориентированное программирование. Язык Python. 11 класс
58
Стек
Если бы в стеке хранились числа:
1
PUSH
POP
2
3
СТЕК
этом ни когда
в какой
времени
мы не можем
Операция,
мымомент
что-нибудь
кладем
! ! При
положить или забрать другие числа между
на стек называется Push, а когда
имеющимися.
Мы можем
забираем элемент
- Pop класть или забирать только
сверху!
К.Ю. Поляков,
Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

59. Стек вызовов функции

Объектно-ориентированное программирование. Язык Python. 11 класс
59
Стек вызовов функции
Стек вызовов хранит функции, которые вызваны:
Стек вызовов
PRINT
Все функции внутри стека вызовов
исполняются. Та функция, которая
лежит на верхушке стека
исполняется
реально, а остальные
Функция исполняющая
«ждут соседа
сверху»,
пока он
запросы
с момента
начала
исполнится.
реализации
кода
К.Ю. Поляков, Е.А. Ерёмин, 2014
PRINT
PRINT
g
PRINT
F
MODUL
http://kpolyakov.spb.ru

60. Объектно-ориентированное программирование. Язык Python

60
Объектноориентированное
программирование.
Язык Python
Пространства имен
в Python.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

61. Пространства имен в Python (namespace)

Объектно-ориентированное программирование. Язык Python. 11 класс
61
Пространства имен в Python (namespace)
Пространство имен — это совокупность определенных в
настоящий момент символических имен и информации об
объектах, на которые они ссылаются.
Существует 4 типа пространств имен:
Встроенное.
Глобальное.
Объемлющее.
Локальное.
Они обладают разными жизненными циклами. По мере
выполнения программы Python создает необходимые
пространства имен и удаляет их, когда потребность в них
пропадает. Как правило, в любой момент времени
существует множество пространств имен.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

62. Встроенное пространство имен (builtins)

Объектно-ориентированное программирование. Язык Python. 11 класс
62
Встроенное пространство имен (builtins)
Встроенное пространство имен содержит имена всех
встроенных объектов, которые всегда доступны при
работе в Python.
Например, такие встроенные функции, как max() и len(),
а также типы объектов — int и str и др.
При запуске интерпретатор Python создает встроенное
пространство имен. Оно сохраняется до тех пор, пока
интерпретатор не завершит работу.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

63. Глобальное пространство имен (global)

Объектно-ориентированное программирование. Язык Python. 11 класс
63
Глобальное пространство имен (global)
Глобальное пространство имен содержит имена,
определенные на уровне основной программы, и
создаётся сразу при запуске тела этой программы.
Сохраняется же оно до момента завершения работы
интерпретатора.
Могут существовать и другие глобальные пространства
имен. Интерпретатор также создает пространство данного
типа для любого модуля, загружаемого программой при
помощи выражения import.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

64. Локальное (local) и объемлющее (enclosing) пространства имен 

Объектно-ориентированное программирование. Язык Python. 11 класс
64
Локальное (local) и объемлющее (enclosing)
пространства имен
Интерпретатор создает новое пространство имен при
каждом выполнении функции. Это пространство является
локальным для функции и сохраняется до момента
завершения ее действия.
Все эти пространства существуют до тех пор, пока
выполняются
соответствующие
им
функции.
По
завершении же этих функций Python может не сразу
отозвать их из памяти, но при этом все ссылки на
содержащиеся в них объекты сразу становятся
недоступными.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

65. Локальное и объемлющее пространства имен 

Объектно-ориентированное программирование. Язык Python. 11 класс
65
Локальное и объемлющее пространства
имен
Функции не
существуют независимо
друг от друга. Может
быть, что одна функция
определена внутри
другой.
def f():
print('Start f()')
def g():
print('Start g()')
print('End g()')
g()
print('End f()')
f()
Когда основная программа вызывает f(), Python
создает для нее новое пространство имен. Аналогичным
образом, когда f() вызывает g(), последняя получает свое
собственное отдельное пространство. Пространство,
созданное для g(), является локальным, а пространство,
созданное для f(), —объемлющим.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

66. Область видимости переменной  

Объектно-ориентированное программирование. Язык Python. 11 класс
66
Область видимости переменной
Наличие нескольких отличных пространств имен
означает, что в процессе выполнения программы Python
несколько разных экземпляров одного имени могут
существовать одновременно. Пока каждый из них
находится в собственном пространстве, все они
обслуживаются по отдельности, и путаницы не происходит.
? Предположим, что вы ссылаетесь на
имя x в коде, а оно существует в
нескольких пространствах. Как Python
узнает, какое именно вы имеете в виду?
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

67. Область видимости переменной  

Объектно-ориентированное программирование. Язык Python. 11 класс
67
Область видимости переменной
Если ваш код ссылается на имя x, то Python будет искать
его следующих областях видимости в таком порядке:
1) Локальная. Если вы ссылаетесь на x внутри функции, то
интерпретатор сначала ищет его в самой внутренней области,
локальной для этой функции.
2) Объемлющая. Если x не находится в локальной области, но
появляется в функции, располагающейся внутри другой
функции, то интерпретатор ищет его в области видимости
объемлющей функции.
3) Глобальная. Если ни один из вышеуказанных вариантов не
принес результатов, то интерпретатор продолжит поиск в
глобальной области видимости.
4) Встроенная. Если интерпретатор не может найти x где-либо
еще, то он направляет поиски во встроенную область
видимости.
! Эта последовательность составляет
суть правила областей видимости LEGB
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

68. Область видимости переменной  

Объектно-ориентированное программирование. Язык Python. 11 класс
68
Область видимости переменной
! Если интерпретатор не находит имя ни в
одной из этих областей, то Python вызывает
исключение NameError
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

69. Объектно-ориентированное программирование. Язык Python

69
Объектноориентированное
программирование.
Язык Python
Класс в Python.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

70. Класс в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
70
Класс в Python
Все данные в Python – это объекты и отношения
между ними. У каждого объекта есть тип. Но не всегда
удобно использовать только те типы, которые уже
определены в языке.
Для того, чтобы определить свои собственные типы
в языке Python есть классы.
Классы позволяют:
Описать поведение объектов данного класса;
Создать объекты данного класса.
! Классы в языке Python - это механизм и синтаксис
для описания собственных типов данных
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

71.

КлассCar
Класс
Объект
Объект
«Моя машина»
Марка – Toyota
Модель – Corolla
Цвет – синий
Текущая скорость – 0
Завести двигатель
Увеличить/уменьшить скорость
Повернуть

72. Класс в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
72
Класс в Python
Класс – шаблон с описанными внутри
характеристиками
и
возможностями,
на
основании которого можно создавать конкретные
объекты («Автомобиль»)
Объект – конкретный экземпляр, созданный
на основании указанного класса («Моя машина»)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

73.

Свойства
Свойства
Масса автомобиля
Максимальная скорость
Мощность двигателя
Методы
Методы
Завести двигатель
Переключить передачу

74. Класс в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
74
Класс в Python
Свойства – характеристики, имеющиеся у
каждого объекта класса (марка, модель, цвет,
текущая скорость)
Методы

функции,
позволяющие
взаимодействовать
со
свойствами
класса
(завести
двигатель,
увеличить
скорость,
уменьшить скорость, повернуть)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

75. Синтаксис определения класса в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
75
Синтаксис определения класса в Python
Ключевое
слово
Имя класса
class Car:
# создаем класс "Автомобиль "
mark = 'Toyota'
# описываем свойства класса
model = 'Corolla'
Тело класса
color = 'blue'
speed = 0
my_car_1 = Car()
# создаем экземпляр класса Car
# выводим тип экземпляра класса
print(type(my_car_1))
В отличии от функций тело класса исполняется в
Результат:
момент определения
самого класса. Для тела класса
<class '__main__.Car'>
создается
отдельное пространство имен. И те имена,
которые в этом namespace остались, затем закрепляются
за объектом класса.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

76. Свойства (атрибуты) класса

Объектно-ориентированное программирование. Язык Python. 11 класс
76
Свойства (атрибуты) класса
После того как объявление класса исполнилось,
создается объект my_car_1
Атрибут
class Car:
mark = 'Toyota'
Атрибут
model = 'Corolla'
Атрибут
color = 'blue'
speed = 0
Атрибут
my_car_1 = Car()
print(f'Марка автомобиля:{my_car_1.mark}')
В данном
примере, после исполнения класса имен в
Результат:
namespace
остались имена: mark, model, color,
Марка автомобиля:Toyota
speed. Они являются атрибутами объекта my_car_1 и мы
сможем обратиться к ним, записав через точку.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

77. Свойства (атрибуты) класса

Объектно-ориентированное программирование. Язык Python. 11 класс
77
Свойства (атрибуты) класса
class Car:
mark = 'Toyota'
Что получим?
model = 'Corolla'
color = 'blue'
speed = 0
my_car_1 = Car()
my_car_1.color = 'red'# меняем значение свойства сolor
my_car_2 = Car() # создаем еще один экземпляр класса Car
print(f'Цвет автомобиля: {my_car_1.color}')
print(f'Цвет автомобиля: {my_car_2.color}')
?
Результат:
Цвет автомобиля: red
Цвет автомобиля: blue
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

78. Методы класса

Объектно-ориентированное программирование. Язык Python. 11 класс
78
Методы класса
class Car:
mark = 'Toyota'
Что получим?
model = 'Corolla'
color = 'blue'
speed = 0
def start_engine():
print('Работает метод start_engine()’)
my_car_1 = Car()
my_car_1.start_engine()
?
Результат:
self – параметр,
передающийся
первым при
Результат:
TypeError:
Car.start_engine()
takes
0 на
создании
метода класса.
Он
содержит в себе
ссылку
Работает
метод
start_engine()
arguments
объект, positional
который вызывает
метод. but 1 was given
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

79. Методы класса

Объектно-ориентированное программирование. Язык Python. 11 класс
79
Методы класса
class Car:
mark = 'Toyota'
model = 'Corolla'
Что получим?
color = 'blue'
speed = 0
def start_engine(self):
print('Работает метод start_engine()’)
def speed_up(self, km_ch):
self.speed += km_ch
my_car_1 = Car()
my_car_1.speed_up(100)
print(f’Скорость автомобиля: {my_car_1.speed}’)
?
Результат:
Скорость автомобиля: 100
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

80. Методы класса

Объектно-ориентированное программирование. Язык Python. 11 класс
80
Методы класса
Магические методы – специальные методы,
добавляющие определенную функциональность для
объектов класса. Названия таких методов всегда
начинаются
и
заканчиваются
с
двух
нижних
подчеркиваний.
Магические методы вызываются автоматически в
определенной ситуации.
По два прочерка слева
и справа
Например: __dict__ - «магический» атрибут,
возвращающий все локальные атрибуты объекта
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

81. Методы класса

Объектно-ориентированное программирование. Язык Python. 11 класс
Методы класса
!
81
Так как мы ранее
воспользовались
методом speed_up (),
то у объекта my_car_1
Что получим?
есть одно локальное
свойство, отличное от
свойств класса Car.
class Car:
mark = 'Toyota'
model = 'Corolla'
color = 'blue'
speed = 0
def start_engine(self):
print('Работает метод start_engine()’)
def speed_up(self, km_ch):
self.speed += km_ch
my_car_1 = Car()
my_car_1.speed_up(100)
print(my_car_1.__dict__)
Результат:
{'speed': 100}
?
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

82. Конструктор

Объектно-ориентированное программирование. Язык Python. 11 класс
82
Конструктор
Для создания
конструктор.
объекта
класса
используется
Чтобы
запустить
конструктор
класса
и
создать
новый
объект
класса
мы
должны
воспользоваться
классом
как функцией и вызвать ее.
Данная запись создает
нам новый объект
класса MyClass
! У любого класса в языке Python всегда есть
конструктор. Конструктор – это единственный
механизм в котором создаются новые объекты!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

83. Действия над объектами, созданными с помощью конструктора

Объектно-ориентированное программирование. Язык Python. 11 класс
83
Действия над объектами, созданными с
помощью конструктора
Определим пустой класс:
Экземпляр
класса
Counter
Заменитель
функционала
класса
Создание
атрибута
экземпляра
В данном случае в классе не определяется никаких
методов или атрибутов. Однако поскольку в нем должно
быть что-то определено, то в качестве заменителя
функционала класса применяется оператор pass.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

84. Конструктор

Объектно-ориентированное программирование. Язык Python. 11 класс
84
Конструктор
В языке Python есть возможность определить
поведение конструктора. Это нужно для того, чтобы
определить некоторые значения атрибутов уже созданных
экземпляров класса по умолчанию.
Для того, чтобы определить поведение конструктора,
необходимо вызвать «магический» метод _ _init_ _() (по
два прочерка с каждой стороны)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

85. Конструктор

Объектно-ориентированное программирование. Язык Python. 11 класс
Конструктор
85
В качестве первого
параметра
конструктор
принимает ссылку
на объект - self.
Конструктор,
устанавливающий
для каждого
созданного
экземпляра класса
Counter атрибут
count равный нулю
Функция _ _init_ _() не должна возвращать никакого
значения, результат этой функции всегда объект None
Поведение установленных в конструкторе атрибутов
не отличается от других атрибутов экземпляра класса.
Можно менять их значение, обращаясь к ним в коде
программы.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

86. Конструктор с параметрами

Объектно-ориентированное программирование. Язык Python. 11 класс
86
Конструктор с параметрами
Функция _ _init_ _() может принимать более одного
аргумента:
Счетчик Counter
начинает свое
исчисление не
только с нуля, а с
любого
произвольного
значения
Например,
начальное
значение 10
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

87. Класс в Python

Объектно-ориентированное программирование. Язык Python. 11 класс
87
Класс в Python
После создания класса в Python гарантируется:
Всегда можно вызвать конструктор созданного
класса:
Например:
х = MyClass()
Мы можем обращаться к атрибутам класса:
MyClass.a
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

88. Пример:

Объектно-ориентированное программирование. Язык Python. 11 класс
88
Пример:
Реализуйте класс Dog. У этого класса должен быть:
- конструктор, печатающий фразу «Родилась новая
собака» в момент создания экземпляра класса Dog
class Dog:
# Конструктор вызывается в момент
#создания объекта
# этого класса;
def __init__(self):
print("Родилась новая собака!")
# Создаем собаку (объект my_dog класса Dog)
my_dog = Dog()
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

89. Пример:

Объектно-ориентированное программирование. Язык Python. 11 класс
89
Пример:
Реализуйте класс Саt. У этого класса должны быть:
- конструктор, принимающий параметры: имя и звук;
Объект класса Cat должен издавать звук ” Mяу”
class Cat:
def __init__(self, name, sound):
self.name = name
self.sound = sound
def make_sound(self):
print(self.sound)
Что получим?
?
cat = Cat('Барсик', 'Mяу-у-у')
cat.make_sound()
Результат:
Mяу-у-у
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

90. Пример:

Объектно-ориентированное программирование. Язык Python. 11 класс
90
Пример:
Реализуйте класс Points (точки). У этого класса должны быть
- конструктор, принимающий два числа x и y, координаты точки
на плоскости;
- атрибуты x и y через которые можно будет получить
координаты точки;
- метод dist, который принимает еще один объект класса Points
и находит эвклидово расстояние между двумя точками.
class Points:
def __init__(self, x, y):
self.x = x
self.y = y
def dist(self, p2):
distance = ((self.x - p2.x)**2 +
(self.y - p2.y)**2)**0.5
return distance
p1 = Points(1.5, 1)
p2 = Points(1.5, 2)
print(p1.dist(p2))
К.Ю.
Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

91. Пример:

Объектно-ориентированное программирование. Язык Python. 11 класс
Пример:
91
? Какие числа будут выведены в
результате выполнения данного кода?
class A:
def __init__(self, val=0):
self.val = val
def add(self, x):
self.val += x
def print_val(self):
print(self.val)
a = A()
b = A(2)
c = A(4)
a.add(2)
b.add(2)
a.print_val()
b.print_val()
c.print_val()
К.Ю. Поляков, Е.А. Ерёмин, 2014
a) 2, 2, 0
b) 0, 0, 0
c) 2, 4, 0
d) 2, 4, 4
e) 0, 2, 4
http://kpolyakov.spb.ru

92. Объектно-ориентированное программирование. Язык Python

92
Объектноориентированное
программирование.
Язык Python
Принципы объектноориентированного подхода
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

93. Принципы ООП. Абстракция

Объектно-ориентированное программирование. Язык Python. 11 класс
93
Принципы ООП. Абстракция
Абстракция

использование
только
тех
характеристик, которые действительно нужны при
проектировке конкретного класса.
Абстракция позволяет:
Выделить главные и наиболее значимые
свойства предмета.
Отбросить второстепенные характеристики.
Любой составной объект реального мира — это
абстракция. Говоря "ноутбук", вам не требуется
дальнейших
пояснений,
вроде
того,
что
это
организованный
набор
пластика,
металла,
жидкокристаллического дисплея и микросхем. Абстракция
позволяет игнорировать нерелевантные детали, поэтому
для нашего сознания это один из главных способов
справляться со сложностью реального мира.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

94. Принципы ООП. Инкапсуляция

Объектно-ориентированное программирование. Язык Python. 11 класс
94
Принципы ООП. Инкапсуляция
Инкапсуляция («помещение в капсулу»)
свойства
внутреннее
устройство
методы
интерфейс
Инкапсуляция («помещение в капсулу») – скрытие
внутреннего устройства объектов.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

95. Принципы ООП. Инкапсуляция

Объектно-ориентированное программирование. Язык Python. 11 класс
95
Принципы ООП. Инкапсуляция
Для управления автомобилем
гонщик
использует
только
те
механизмы управления, которые
для
этого
предназначены.
И
дополнительное вмешательство во
внутреннее устройство машины во
время гонки явно не лучшая затея.
Примерно так же работает принцип
инкапсуляция.
Инкапсуляция – механизм предоставления доступа
только к определенным свойствам и методам класса.
Главная роль инкапсуляции – предоставление доступа
только к определенным свойствам и методам класса с
целью обеспечения его безопасного использования
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

96. Модификаторы доступа в ООП

Объектно-ориентированное программирование. Язык Python. 11 класс
96
Модификаторы доступа в ООП
Модификатор
доступа
public
(публичный)
protected
(защищенный)
private
(приватный)
Определение
Доступ возможен как внутри
класса, так и снаружи
Доступ возможен внутри класса и
в классах-потомках
Доступ возможен только внутри
класса
! Ключевые слова public, protected и private
используются напрямую в языках программирования
С++, С#, Java и др. Но в языке Python работа с
модификаторами доступа обстоит немного иначе.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

97. Модификаторы доступа в ООП

Объектно-ориентированное программирование. Язык Python. 11 класс
97
Модификаторы доступа в ООП
!
В Python все поля и методы по умолчанию
являются публичными, то есть доступны в любой
части программы.
Получается, что защищенных и приватных полей в
Python нет.
Зачем же мы тогда о них говорили ранее?
На самом деле, философия языка Python
предполагает доверие разработчиков по отношению друг
к другу при написании программного кода, поэтому мы
можем при желании получить доступ к любому полю или
методу любого класса.
Но далеко не всегда это стоит делать!
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

98. Модификаторы доступа в ООП

Объектно-ориентированное программирование. Язык Python. 11 класс
98
Модификаторы доступа в ООП
Разработчики языка Python предлагают следующие
соглашения для реализации защищенных полей:
Поля и методы считаются защищенными, если
их названия начинаются с одного нижнего
подчеркивания (например, _speed).
Поля и методы считаются приватными, если их
названия начинаются с двух нижних подчеркиваний
(например, __model).
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

99. Модификаторы доступа в ООП

Объектно-ориентированное программирование. Язык Python. 11 класс
99
Модификаторы доступа в ООП
class Car:
def __init__(self, color, model, speed=0):
self.color = color
Что получим?
self._speed = speed
self.__model = model
def show_info(self):
print(f'Цвет:{self.color}')
print(f’Скорость:{self._speed}')
print(f'Модель:{self.__model}')
my_car = Car(color='Синий', speed=10,
model='Skyline')
my_car.show_info()
Цвет:Синий
?
К.Ю. Поляков, Е.А. Ерёмин, 2014
Скорость:10
Модель:Skyline
http://kpolyakov.spb.ru

100. Модификаторы доступа в ООП

Объектно-ориентированное программирование. Язык Python. 11 класс
100
Модификаторы доступа в ООП
class Car:
def __init__(self, color, model, speed=0):
self.color = color
Мы не смогли
Можно
обратиться
self._speed = speed
Что получим?
кполучить
полю
__model.
доступ к
self.__model = model
приватному
Для
этого нужно
полю!
слева от __model
def show_info(self):
добавить
print(f'Цвет:{self.color}')
конструкцию _Car
print(f’Скорость:{self._speed}')
!
?
print(f'Модель:{self.__model}')
my_car = Car(color='Синий',speed=10,
model='Skyline')
print(my_car.color)
Синий
10
print(my_car._speed)
AttributeError: 'Car' object
print(my_car.__model) has no attribute '__model'
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

101. Модификаторы доступа в ООП

Объектно-ориентированное программирование. Язык Python. 11 класс
101
Модификаторы доступа в ООП
Механизм, который мы применили для обращения к
приватному полю, называется «искажение имени». При
этом происходит неявная замена имени атрибута, из-за
которого возникает ошибка, если мы пробуем обратиться
по его названию с двумя нижними подчеркиваниями.
Такое поведение работает с любыми приватными
атрибутами – будь то поле или метод.
Общий вид принципа работы искажения имени:
доступа к приватному полю вне класса любой
! Для
атрибут вида __attr неявно заменяется на
_class__attr, при этом class – это имя текущего
класса.
Например: print(my_car._Car__model)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

102. Принципы ООП. Наследование

Объектно-ориентированное программирование. Язык Python. 11 класс
102
Принципы ООП. Наследование
Классификация – разделение изучаемых объектов на
группы (классы), объединенные общими признаками.
Фрукт
Яблоко
Груша
базовый класс
Банан
Апельсин
классынаследники
это фрукт,
у которого…
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

103. Принципы ООП. Наследование

Объектно-ориентированное программирование. Язык Python. 11 класс
103
Принципы ООП. Наследование
класс Двудольные
семейство Бобовые
род Клевер
горный клевер
наследует свойства
(имеет все свойства)
Класс Б является наследником класса А, если можно
сказать, что Б – это разновидность А.
яблоко – фрукт
яблоко – это фрукт
горный клевер – клевер
горный клевер – это
растение рода Клевер
машина – двигатель
машина содержит
двигатель (часть – целое)
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

104. Принципы ООП. Наследование

Объектно-ориентированное программирование. Язык Python. 11 класс
104
Принципы ООП. Наследование
Наследование – механизм создания новых классов
на основании уже существующих.
Родительский класс – класс, от которого ведется
наследование. Такие классы еще называют базовыми
или суперклассами.
Дочерний класс – класс, который наследуется от
родительского.
Такие
классы
еще
называют
наследниками или подклассами
С помощью наследования можно создавать
дочерние классы на основании родительских, это
позволяет избежать возможного дублирования кода. Все
изменения, внесенные в родительский класс, будут
отражены и в дочерних классах.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

105. Принципы ООП. Наследование

Объектно-ориентированное программирование. Язык Python. 11 класс
105
Принципы ООП. Наследование
Например, каждый класс – это человек с отдельной
профессией – медик, строитель и программист. В
данном случае каждый класс – это отдельная сущность и
если нужны изменения, придется вносить изменения в
каждый класс отдельно.
Учитывая,
что
некоторые
изменения
могут
дублироваться за счет общих полей и методов, удобно,
если мы будем иметь один базовый класс, от которого
будут наследоваться все три наших класса
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

106. Принципы ООП. Наследование

Объектно-ориентированное программирование. Язык Python. 11 класс
106
Принципы ООП. Наследование
В данном случае BaseHuman – это базовый класс, а
классы Human1, Human2 и Human3 – его наследники. И
если нам нужно внести некоторые изменения сразу во все
классы, то можем сделать это в базовом классе, и все
указанные изменения автоматически произойдут и в
классах-потомках.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

107. Наследование в Python. Синтаксис.

Объектно-ориентированное программирование. Язык Python. 11 класс
107
Наследование в Python. Синтаксис.
class BaseHuman:
def __init__(self, name, age):
self.name = name
# имя
self.age = age
# возраст
def introduce(self):
print(f’Меня зовут {self.name}!')
print(f'Мой возраст: {self.age}')
# Наследуем класс Programmer от класса BaseHuman
class Programmer(BaseHuman):
pass
human = BaseHuman(name='Миша', age=25)
proger = Programmer(name='Дима', age=26)
human.introduce()
Меня зовут Миша!
proger.introduce()
Мой возраст: 25
?
Что получим?
К.Ю. Поляков, Е.А. Ерёмин, 2014
Меня зовут Дима!
Мой возраст: 26
http://kpolyakov.spb.ru

108. Наследование в Python. Синтаксис.

Объектно-ориентированное программирование. Язык Python. 11 класс
108
Наследование в Python. Синтаксис.
# Дополним класс для моделирования программиста
class Programmer(BaseHuman):
def coding(self):
print(f'Программист {self.name}')
human = BaseHuman(name='Миша', age=25)
proger = Programmer(name='Дима', age=26)
proger.coding()
human.coding()
Что получим?
?
Программист Дима
AttributeError: 'BaseHuman'
object has no attribute 'coding'
!
Атрибуты класса наследуются только от
родителя к потомку.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

109. Переопределение атрибутов

Объектно-ориентированное программирование. Язык Python. 11 класс
109
Переопределение атрибутов
Помимо создания новых методов, мы можем
переопределять родительские атрибуты.
Например, переопределим метод __init__() в классе
Programmer, добавив в него еще одно свойство – язык
программирования,
на
котором
пишет
данный
программист:
class Programmer(BaseHuman):
def coding(self):
print(f'Программист {self.name}’)
def __init__(self, name, age, language):
self.name = name
self.age = age
self.language = language
? В чем недостаток текущей реализации метода
__init__() для класса Programmer?
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

110. Переопределение атрибутов

Объектно-ориентированное программирование. Язык Python. 11 класс
110
Переопределение атрибутов
class Programmer(BaseHuman):
def coding(self):
print(f'Программист {self.name}’)
def __init__(self, name, age, language):
self.name = name
self.age = age
self.language = language
Наследование призвано сократить дублирование
! кода.
А сейчас мы ровно это и сделали – полностью
скопировали и вставили метод __init__() из класса
BaseHuman! На самом деле, этого можно избежать с
помощью специальной функции super()
super() позволяет обращаться к методам
! Функция
родительского класса и использовать внутри
дочернего класса.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

111. Переопределение атрибутов

Объектно-ориентированное программирование. Язык Python. 11 класс
111
Переопределение атрибутов
class Programmer(BaseHuman):
def coding(self):
print(f'Программист {self.name}’)
def __init__(self, name, age, language):
# вызываем метод __init__() из базового класса
super().__init__(name, age)
self.language = language
Функция super() позволяет обратиться к суперклассу
текущего класса, в нашем случае – к BaseHuman, и
вызвать из него метод __init__(). Как итог – мы словно
попросили класс BaseHuman выполнить свою версию
метода __init__(), а результат дополнили свойством
self.language.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

112. Многоуровневое наследование

Объектно-ориентированное программирование. Язык Python. 11 класс
112
Многоуровневое наследование
BaseHuman
Многоуровневое
наследование – тип
наследования, когда у
суперкласса есть
подкласс, у которого
также есть подкласс. В
результате образуется
иерархия наследования
из 3 или более уровней.
поля класса
методы класса
Programmer
поля класса
методы класса
BackendProg
поля класса
методы класса
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

113. Многоуровневое наследование

Объектно-ориентированное программирование. Язык Python. 11 класс
113
Многоуровневое наследование
class BaseHuman:
def __init__(self, name, age):
self.name = name
self.age = age
class Programmer(BaseHuman):
def __init__(self, name, age, language):
super().__init__(name, age)
self.language = language
class BackendProg(Programmer):
pass
# экземпляр класса BackendProg
backproger = BackendProg()
Что получим?
print(backproger.__dict__)
?
TypeError: Programmer.__init__() missing 3
required positional arguments: 'name', 'age',
and 'language'
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

114. Многоуровневое наследование

Объектно-ориентированное программирование. Язык Python. 11 класс
114
Многоуровневое наследование
class BaseHuman:
def __init__(self, name, age):
self.name = name
self.age = age
class Programmer(BaseHuman):
def __init__(self, name, age, language):
super().__init__(name, age)
self.language = language
class BackendProg(Programmer):
pass
Что получим?
# экземпляр класса BackendProg
backproger = BackendProg(name='Иван', age=27,
language='C++')
print(backproger.__dict__)
?
{'name': 'Иван', 'age': 27, 'language': 'C++'}
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

115. Многоуровневое наследование

Объектно-ориентированное программирование. Язык Python. 11 класс
115
Многоуровневое наследование
!
class BaseHuman:
При многоуровневом
def __init__(self, name, age):
наследовании
self.name = name
методы вызываются
self.age = age
согласно
def walk(self):
построенной
print(f'{self.name} идет
на прогулку.')
иерархии
классов!
class Programmer(BaseHuman):
def __init__(self, name, age, language):
super().__init__(name, age)
self.language = language
class BackendProg(Programmer):
pass
backproger = BackendProg(name='Иван', age=27,
language='C++')
backproger.walk()
Что получим?
Иван идет на прогулку.
К.Ю. Поляков, Е.А. Ерёмин, 2014
?
http://kpolyakov.spb.ru

116. Многоуровневое наследование

Объектно-ориентированное программирование. Язык Python. 11 класс
116
Многоуровневое наследование
issubclass() – функция, позволяющая проверить,
является ли класс наследником другого класса, возвращая
True или False. Учитывает иерархию наследования
классов.
# проверяем, что класс BackendProg подкласс для Programmer
print(issubclass(BackendProg, Programmer))
True
__base__ - атрибут, возвращающий базовый класс
для указанного класса
# выводим на экран базовый класс для класса Programmer
print(Programmer.__base__)
<class '__main__.BaseHuman'>
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

117. Многоуровневое наследование

Объектно-ориентированное программирование. Язык Python. 11 класс
117
Многоуровневое наследование
object
# выводим на экран базовый класс
# для класса BaseHuman
print(BaseHuman.__base__)
? Что получим?
<class 'object'>
поля класса
методы класса
BaseHuman
поля класса
методы класса
Programmer
object – класс, являющийся
! базовым
для всех классов в
языке Python.
поля класса
методы класса
BackendProg
поля класса
методы класса
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

118. Многоуровневое наследование

Объектно-ориентированное программирование. Язык Python. 11 класс
118
Многоуровневое наследование
isinstance() – функция, позволяющая проверить,
является ли объект прямым или косвенным экземпляром
другого класса, возвращая True или False. Учитывает
иерархию наследования классов.
# проверяем, что proger является экземпляром класса Programmer
print(isinstance(proger, Programmer))
? Что получим?
True
print(isinstance(proger, BaseHuman))
!
Все логично – proger является
экземпляром класса Programmer,
который является наследником класса
BaseHuman.
К.Ю. Поляков,
Е.А. Ерёмин, 2014
True
http://kpolyakov.spb.ru

119. Наследование в Python.

Объектно-ориентированное программирование. Язык Python. 11 класс
119
Наследование в Python.
Например, нужен объект, который будет «вести себя»
как list, но при этом у него будет дополнительный метод,
который определяет является ли число элементов в листе
четным или нечетным. При этом мы не хотим создавать
класс
с нуля. В таком случае и используется
наследование классов:
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

120. Наследование в Python.

Объектно-ориентированное программирование. Язык Python. 11 класс
120
Наследование в Python.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

121. Множественное наследование

Объектно-ориентированное программирование. Язык Python. 11 класс
121
Множественное наследование
Язык
Python
поддерживает
множественное
наследование классов, т.е один класс – наследник может
иметь несколько классов - родителей
Имя класса - наследника
К.Ю. Поляков, Е.А. Ерёмин, 2014
Имя
Имя класса
класса -- родителя
родителя
http://kpolyakov.spb.ru

122. Пример множественного наследования

Объектно-ориентированное программирование. Язык Python. 11 класс
122
Пример множественного наследования
class Parent1:
? Результат?
def func(self):
print("Parent1")
class Parent2:
def func(self):
print("Parent2")
class Child(Parent1, Parent2):
pass
obj = Child()
obj.func()
Результат:
Parent1
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

123. Полиморфизм

Объектно-ориентированное программирование. Язык Python. 11 класс
123
Полиморфизм
Полиморфизм – механизм, позволяющий
объектам разных типов использовать один и тот
же интерфейс (оператор, функция, метод, класс),
это возможность классов-наследников поразному реализовать метод с одним и тем же
именем.
!
!
Обеспечивается иерархией
наследования;
Удобен в том случае, когда
требуется одинаково работать с
однотипными объектами;
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

124. Пример полиморфизма

Объектно-ориентированное программирование. Язык Python. 11 класс
124
Пример полиморфизма
class Pet:
def __init__(self, name):
self.name = name
class Cat(Pet):
def make_sound(self):
print(self.name, ': Мяу')
class Dog(Pet):
def make_sound(self):
print(self.name, ': Гав!')
pets = Dog('Шарик'), Dog ('Барбос'),Cat ('Мурзик')
for pet in pets:
Результат
pet.make_sound()
Шарик : Гав
Барбос : Гав
Мурзик : Мяу
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

125. Полиморфизм

Объектно-ориентированное программирование. Язык Python. 11 класс
Полиморфизм
К.Ю. Поляков, Е.А. Ерёмин, 2014
125
Абстрактный
класс
Абстрактные
методы
http://kpolyakov.spb.ru

126. Полиморфизм

Объектно-ориентированное программирование. Язык Python. 11 класс
126
Полиморфизм
Абстрактный класс – класс, служащий в
качестве шаблона для создания других классов.
Содержит в себе один или несколько
абстрактных методов.
Абстрактный метод – метод, который объявлен,
но не имеет реализации в абстрактном классе.
Подклассы абстрактного класса должны иметь
собственную реализацию абстрактных методов.
К.Ю. Поляков, Е.А. Ерёмин, 2014
http://kpolyakov.spb.ru

127.

Объектно-ориентированное программирование. Язык Python. 11 класс
К.Ю. Поляков, Е.А. Ерёмин, 2014
127
http://kpolyakov.spb.ru
English     Русский Rules