Similar presentations:
Наследование инкапсуляция полиморфизм
1. Наследование, инкапсуляция, полиморфизм
print(“ООП”)2. Наследование
3. ООП
Следующее по важности понятие объектно-ориентированного программирования –наследование. Вернемся к столам. Пусть есть класс столов, описывающий общие
свойства всех столов. Однако можно разделить все столы на письменные,
обеденные и журнальные и для каждой группы создать свой класс, который
будет наследником общего класса, но также вносить ряд своих особенностей.
Таким образом, общий класс будет родительским, а классы групп – дочерними,
производными. Дочерние классы наследуют особенности родительских, однако
дополняют или в определенной степени модифицируют их характеристики. Когда
мы создаем конкретный экземпляр стола, то должны выбрать, какому классу
столов он будет принадлежать. Если он принадлежит классу журнальных столов,
то получит все характеристики общего класса столов и класса журнальных
столов.
4. Наследование
# Базовый класс (родительский)class Animal:
def __init__(self, name, species):
self.name = name
self.species = species
def make_sound(self):
return "Some generic animal sound"
def describe(self):
return f"{self.name} is a {self.species}"
5. Наследование
# Производный класс (дочерний), наследуется от Animalclass Dog(Animal):
def __init__(self, name, breed):
# Вызов конструктора родительского класса
super().__init__(name, species="Dog")
self.breed = breed
# Переопределение метода родительского класса
def make_sound(self):
return "Woof!"
# Новый метод, специфичный для Dog
def fetch(self):
return f"{self.name} is fetching the ball"
6. Наследование
Для иллюстрации концепции наследования определим класс Publication, которыйимеет свойства, общие для всех публикаций – title, author и year, а также
общий метод display():
7. Наследование
Теперь создадим два подкласса Book и Magazine, которые наследуют всесвойства и методы от класса Publication, и кроме того, имеют свои атрибуты.
Подкласс Book добавляет свойство isbn и переопределяет метод display() для
включения свойства isbn. Подкласс Magazine добавляет свойство issue_number
(номер выпуска) и переопределяет метод display() для включения свойства
issue_number:
8. Наследование
9. Наследование
10. Инкапсуляция
11. Инкапсуляция
Инкапсуляция в ООП понимается двояко. Во многих языках этот терминобозначает сокрытие данных, то есть невозможность напрямую получить доступ
к внутренней структуре объекта, так как это небезопасно. Например,
наполнить желудок едой можно напрямую, положив еду в желудок. Но это
опасно. Поэтому прямой доступ к желудку закрыт. Чтобы наполнить его едой,
надо совершить ритуал, через элемент интерфейса под названием рот.
В Python нет такой инкапсуляции, хотя она является одним из стандартов ООП.
В Python можно получить доступ к любому атрибуту объекта и изменить его.
Однако есть механизм, позволяющий имитировать сокрытие данных, если это так
уж необходимо
12. Инкапсуляция
Это, как с реальными вещами. Например, когда мы покупаем автомобиль, то намважно как им управлять, какие у него характеристики, но совершенно не имеет
значения, как работает двигатель, почему крутятся колеса, из чего сделаны
стекла, как взаимодействуют между собой все его агрегаты и прочее и прочее.
Пользователю автомобиля главное, чтобы он безупречно работал и довозил его
с комфортом из п. А в п. Б.
То есть, машина в целом, это некая капсула, которая внутри себя скрывает
огромное количество разных узлов, взаимодействующих между собой. И, в
идеале, нам совершенно не важен их внутренний алгоритм функционирования.
Важен конечный результат – завели и поехали!
13. Инкапсуляция
Публичные атрибуты и методы: По умолчанию все атрибуты и методы в Pythonявляются публичными.
Пример: self.name доступен напрямую.
Защищённые атрибуты и методы: Имена начинаются с одного подчёркивания
(_attribute).
Это соглашение, которое сигнализирует, что атрибут или метод предназначен
для внутреннего использования в классе или его подклассах. Однако доступ
всё равно возможен.
14. Инкапсуляция
Приватные атрибуты и методы:Имена начинаются с двух подчёркиваний (__attribute).
Python использует механизм "name mangling" (искажение имён), чтобы сделать
такие атрибуты и методы менее доступными извне.
15. Инкапсуляция
class BankAccount:def __init__(self, owner, balance):
self.owner = owner # Публичный атрибут
self._account_number = "12345" # Защищённый атрибут
self.__balance = balance # Приватный атрибут
16. Полиморфизм
17. Полиморфизм
Полиморфизм можно перевести как множество форм. В ООП подполиморфизмом понимается следующее. Объекты разных классов, с
разной внутренней реализацией, то есть программным кодом,
могут иметь "одинаковые" методы. На самом деле у методов
совпадают только имена, а вложенный в них код (то, что они
делают) различен. Вот и получается, что у одного имени как бы
множество форм.
18. Полиморфизм
Например, для чисел есть операция сложения, обозначаемаязнаком +. Однако мы можем определить класс, объекты которого
также будут поддерживать операцию, обозначаемую этим знаком.
Но это вовсе не значит, что объекты должны быть числами, и
будет получаться какая-то сумма. Операция + для объектов
нашего класса может значить что-то иное. Но интерфейс, в
данном случае это знак +, у чисел и нашего класса будет
одинаков. А полиморфизм проявляется во внутренней реализации
и результате операции.
19. Полиморфизм
# Базовый классclass Animal:
...
# Производный класс 1
class Dog(Animal):
def speak(self):
return "Woof!"
# Производный класс 2
class Cat(Animal):
def speak(self):
return "Meow!"
# Пример использования
dog = Dog()
cat = Cat()
# Вызов метода speak() для разных объектов
animals = [dog, cat]
for animal in animals:
animal.speak()
20. Практика
1. Создайте базовый класс Vehicle с атрибутами brand (марка) и year (годвыпуска), а также методом describe, который возвращает описание
транспортного средства. Создайте два производных класса Car и Bicycle,
которые наследуются от Vehicle. Класс Car должен иметь дополнительный
атрибут fuel_type (тип топлива) и переопределять метод describe, добавляя
информацию о топливе. Класс Bicycle должен иметь атрибут has_basket
(наличие корзины) и также переопределять метод describe.
21. Практика
2. Создайте класс Student с атрибутами name (публичный) и __grade(приватный, оценка от 0 до 100). Реализуйте методы для получения и
изменения оценки: метод get_grade для получения текущей оценки и метод
set_grade для установки новой оценки с проверкой, что значение находится в
диапазоне от 0 до 100. Если значение выходит за пределы, метод должен
возвращать сообщение об ошибке.
22. Практика
3. Создайте базовый класс Shape с методом area, который возвращает строку"Area is not defined". Создайте два производных класса: Circle (с радиусом)
и Rectangle (с длиной и шириной). Каждый класс должен переопределять метод
area, возвращая площадь фигуры. Напишите функцию, которая принимает объект
типа Shape и выводит его площадь.
23. Практика
4. Создайте базовый класс Employee с приватным атрибутом __salary ипубличным атрибутом name. Реализуйте методы get_salary и set_salary для
работы с зарплатой. Добавьте метод work, который возвращает общую строку "I
am working". Создайте два производных класса: Developer и Manager. Каждый
должен переопределять метод work, возвращая специфичное описание работы
(например, "I am coding" для Developer). Реализуйте функцию, которая
принимает список сотрудников и вызывает их метод work.
programming