Similar presentations:
ООП в Питоне, Наследование, Инкапсуляция и Полиморфизм
1.
Основы объектноориентированногопрограммирования в Python
Объектно-ориентированное программирование (ООП) — это методология,
позволяющая структурировать сложные системы через классы и объекты.
В центре внимания находится объединение данных и поведения в единые
сущности, что обеспечивает масштабируемость и чистоту кода в современной
разработке программного обеспечения.
Юсупов Сирож
ФЗ-ЦП-202Б
2.
Ограничения базовых структур данных для сложныхданных
!
Списки и Словари
Использование
списков
✓
требует
запоминания
Преимущества Классов
Классы
обеспечивают
целостность
данных,
числовых индексов, что часто приводит к ошибкам
гарантируя наличие необходимых атрибутов у
и
каждого
В
путанице.
словарях
отсутствует
строгая
объекта.
валидация
Логика обработки (методы) встроена прямо в
ключей, что делает структуру данных хрупкой и
структуру данных, что упрощает поддержку кода.
непредсказуемой.
Устраняется риск передачи некорректных структур
Данные существуют отдельно от функций, которые
их обрабатывают, создавая фрагментированную
логику.
в сторонние функции.
3.
Основная проблема: фрагментированныеданные и поведение
Разрыв связи между информацией и функциями, которые
её обрабатывают, неизбежно приводит к созданию
неуправляемого кода по мере роста программного
продукта.
4.
Чертёж и дом: классы против объектовДля понимания ООП лучше всего использовать архитектурную аналогию:
01
Класс
Это чертёж или технический рисунок.
Он описывает структуру (окна, двери), но
в нём нельзя жить. Это лишь шаблон.
Объект (экземпляр)
Это физический дом, построенный по чертежу. Он имеет
конкретный цвет стен и адрес.
По одному чертежу (классу) можно создать неограниченное
количество уникальных домов (объектов), каждый из которых
будет обладать собственным состоянием.
02
5.
Определение синтаксиса первого класса PythonОбъявление класса в Python начинается с ключевого слова class. Согласно конвенции PEP 8, имена классов
пишутся в стиле CamelCase.
student.py
1
2
class Student:
pass # Заглушка для пустого тела класса
Создание экземпляра (объекта) происходит путем вызова класса как функции: s1 = Student(). На этом этапе
объект уже существует в памяти, но пока не содержит уникальных данных.
6.
Метод конструктора и роль «я»Магический метод
Инициализация
Метод __init__ — это
Его главная задача —
магический метод, который
инициализация начального
Python вызывает
автоматически при создании
self
нового объекта.
Ключевой параметр self является ссылкой на
текущий экземпляр класса. Именно через self
Python понимает, к какому конкретному объекту
нужно привязать данные. Без self атрибуты были
бы локальными переменными.
состояния экземпляра.
7.
Практическая реализация метода InitКод Конструктора
Механика Присвоения
1
2
3
4
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
Параметры name и age передаются при создании:
Student("Анна", 20).
Инструкция self.name = name создает атрибут
экземпляра, доступный во всем объекте.
Это гарантирует, что каждый студент получит свой
набор данных сразу в момент рождения объекта.
8.
Расширение функциональности с помощью уникальныхметодов потомков
Специализация Поведения
Переопределение
Дочерние классы могут определять методы, которых
Наследник может полностью изменить логику
нет у родителя.
родительского метода.
Класс Dog может иметь метод bark(), а класс Cat —
Потомки наполняют пустые методы родителя
метод meow().
конкретным смыслом.
Объекты имеют общий фундамент, но различаются в
Гибкость: расширение системы без изменения
деталях реализации.
исходного кода базовых классов.
9.
Создание живых объектов с уникальными даннымиКлассы позволяют создавать множество объектов, которые живут независимо друг от друга.
anna
1
oleg
2
Объект anna = Student("Анна", 20)
Объект oleg = Student("Олег", 21)
хранит свои значения в
никак не влияет на данные Анны.
собственной области памяти.
anna.name → "Анна"
Изоляция состояний
Обращение к данным происходит
oleg.name → "Олег"
через точечную нотацию. Это
обеспечивает изоляцию
состояний в памяти.
10.
Проверка связей с Isinstance и множественнымнаследованием
isinstance()
Множественное
наследование
Python предоставляет инструменты для анализа
Класс может иметь несколько родителей: class
происхождения объектов. Функция isinstance(obj, Class)
Bat(Animal, Flying).
проверяет, является ли объект экземпляром класса или
его наследником.
Внимание: Требует осторожности из-за алгоритма поиска
методов (MRO), который может усложнить отладку.
11.
Инкапсуляция: защита данных исогласованность
Публичный Интерфейс
То, что видит и использует внешний код.
Внутренняя Реализация
Инкапсуляция скрывает внутренние детали реализации, предотвращая
несанкционированный доступ и гарантируя, что объект всегда
остается в валидном состоянии.
12.
Правила конфиденциальности и искажение имён в Python_
__
Защищенные атрибуты
Приватные атрибуты
Имена с одним подчеркиванием (_age) — это
Двойное подчеркивание активирует механизм name
"джентльменское соглашение".
mangling (искажение имени).
Сигнал: "этот атрибут для внутреннего использования,
Атрибут __balance превращается в _Account__balance.
не трогайте его снаружи".
Защищает данные от случайного переопределения и
Технически доступ остается открытым, но это считается
затрудняет прямой доступ.
плохим тоном.
13.
Контролируемый доступ с геттерами и сеттерамиДля "культурного" управления данными используется декоратор @property. Он превращает
метод в виртуальный атрибут.
@property (Геттер)
@setter (Сеттер)
Позволяет обращаться к методу как к обычному атрибуту
Внедряет логику валидации. Запрещает установку
без скобок.
некорректных значений, сохраняя целостность данных.
14.
Обучение объектов действию с помощью методов экземпляра1
2
Определение
Функции внутри класса,
описывающие поведение.
Аргумент self
Обязательный первый
аргумент для доступа к
данным.
3
Авто-вызов
Python подставляет self
автоматически при вызове.
Методы — это функции, определенные внутри класса. Чтобы метод мог работать с
внутренними данными объекта, он обязан принимать self. Вызов метода
осуществляется просто: obj.method().
15.
Интегрированный пример: Система банковских счетовКласс BankAccount
1
Инкапсуляция: Баланс скрыт через __balance.
3
Полиморфизм: Метод deposit переопределен для
бонусов.
2
Наследование: Класс CashbackAccount расширяет
счет.
4
Валидация: Снятие невозможно при превышении
остатка.
Объединение всех принципов ООП создает надежную и масштабируемую бизнес-логику.
16.
Атрибуты классов против атрибутов экземпляраХарактеристика
Атрибут экземпляра
Атрибут класса
Место объявления
Внутри __init__ через self
В теле класса (вне методов)
Область владения
Принадлежит конкретному
объекту
Общий для всех объектов класса
Пример использования
Имя студента, его возраст
Общий счетчик студентов,
название вуза
Доступ
self.attribute
ClassName.attribute
17.
Стратегические рекомендации по созданиюпользовательских классов
Чек-лист применения ООП
01
02
03
04
Используйте классы для моделирования сложных сущностей
с состоянием.
Применяйте наследование только при наличии связи
"является частью".
Скрывайте данные, которые могут быть повреждены при
прямом доступе.
Для простых вычислений без сохранения состояния
используйте обычные функции.
18.
Введение в наследование и повторное использование кодаAnimal (Parent)
Наследование — это механизм, позволяющий создать новый
класс на основе существующего. Это решает проблему
дублирования кода.
Dog (Child)
Cat (Child)
1
Родительский класс (базовый) содержит общую
2
логику.
Дочерний класс (производный) наследует все атрибуты и методы.
3
Позволяет строить сложные иерархии специализированных классов.
19.
Реализация наследования с помощью суперфункцииДля создания наследника имя родителя указывается в
скобках: class Dog(Animal):.
Роль super()
Функция super() возвращает временный объект
родительского класса. Инструкция super().__init__(name)
обеспечивает настройку базовых свойств перед
добавлением уникальных атрибутов.
1
2
3
4
5
6
7
8
class Animal:
def __init__(self, name):
self.name = name
class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name)
self.breed = breed
20.
Полиморфизм: один интерфейс смножественными реализациями
Собака
Кошка
make_sound()
Корова
Птица
Каждый объект отреагирует по-своему. Это делает код невероятно
гибким: вы можете добавлять новые типы объектов, не меняя функции,
которые ими управляют.
21.
Типизация duck и гибкий дизайн интерфейсовВ Python тип объекта вторичен по сравнению с его
"Если это выглядит как утка и
крякает как утка, то это утка"
возможностями. Если объекту нужно быть "длинным",
Python просто ищет метод __len__.
Нам не нужно формальное наследование от
интерфейса. Это позволяет создавать универсальные
интерфейсы, работающие с любыми типами данных.
programming