мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| python:week22 [21/01/2019 00:25] – [Объектно-ориентированное программирование] ybezrukov | python:week22 [21/01/2019 12:02] (текущий) – [Процедурные языки] ybezrukov | ||
|---|---|---|---|
| Строка 4: | Строка 4: | ||
| Чтобы понять что такое объектно-ориентированное программирование (ООП) нужно сначала понять что оно заменяет. Ранние языки были процедурными: | Чтобы понять что такое объектно-ориентированное программирование (ООП) нужно сначала понять что оно заменяет. Ранние языки были процедурными: | ||
| - | |||
| - | |||
| - | |||
| - | To understand what an object-oriented programming language is, you need to understand what it replaced. Early programming languages were procedural—so-called because the programmer would define a very specific set of procedures that the computer would undertake. | ||
| В те времена процедуры записывались на перфокартах. На каждом шаге данные читались, | В те времена процедуры записывались на перфокартах. На каждом шаге данные читались, | ||
| Строка 24: | Строка 20: | ||
| Чем ОО подход лучше процедурного? | Чем ОО подход лучше процедурного? | ||
| + | |||
| + | ===== Абстракция ===== | ||
| + | |||
| + | К нашему счастью, | ||
| + | |||
| + | Тоже самое можно сказать и о объектах в ООП. Вернемся к шахматам, | ||
| + | |||
| + | ===== Инкапсуляция или сокрытие ===== | ||
| + | |||
| + | В ООП это метод с помощью которого в ООП реализуется абстракция. Каждый объект это набор данных, | ||
| + | |||
| + | Обычно переменные считаются скрытыми, | ||
| + | |||
| + | Шахматная фигура Слон может, например, | ||
| + | |||
| + | Когда программист делает переменную приватной а метод move() общественным (публичным) он защищает ее значение от изменения каким-нибудь внешним действием. Аналогично, | ||
| + | |||
| + | Все эти переменные и методы хранятся в пределах объекта Слон. Так как они сокрыты, | ||
| + | |||
| + | ===== Наследование ===== | ||
| + | |||
| + | В дополнение к классам, | ||
| + | |||
| + | Создание подклассов позволяет экономить время. Вместо создания новых классов для всего программист создает базовый класс и затем расширяет его новыми подклассами по мере необходимости. | ||
| + | |||
| + | ===== Полиморфизм ===== | ||
| + | |||
| + | Полиморфизм это следствие наследования. Чтобы полностью его понять потребуется некоторый опыт в программировании, | ||
| + | |||
| + | Например, | ||
| + | |||
| + | В этом случае, | ||
| + | |||
| + | ===== Резюме ===== | ||
| + | |||
| + | Прочитанное наверняка вызывает больше вопросов об ООП чем дает ответов. Перечислим кратко основное: | ||
| + | |||
| + | * ООП собирает информацию в единую сущность, | ||
| + | * Каждый объект это конкретный экземпляр класса. | ||
| + | * Абстракция скрывает внутренние механизмы объекта, | ||
| + | * Инкапсуляция хранит и защищает соответствующие переменные и методы внутри объекта. | ||
| + | * Наследование позволяет подклассам использовать атрибуты родительских классов. | ||
| + | * Полиморфизм позволяет объектам и методам работать с разными ситуациями с помощью одного интерфейса. | ||
| + | |||
| + | Если запомните эти пункты, | ||
| + | |||
| + | ====== ООП в Питоне ====== | ||
| + | |||
| + | ===== Классы ===== | ||
| + | |||
| + | Класс это базовый строительный блок в ООП. Можно считать класс шаблоном или чертежом объекта, | ||
| + | |||
| + | <code python> | ||
| + | class Vehicle: | ||
| + | """ | ||
| + | pass | ||
| + | </ | ||
| + | |||
| + | Комментарий в начале класса это специальный вид комментария, | ||
| + | |||
| + | Ключевое слово '' | ||
| + | |||
| + | Если мы этот код запустим, | ||
| + | |||
| + | <code python> | ||
| + | red_car = Vehicle() | ||
| + | green_car = Vehicle() | ||
| + | blue_car = Vehicle() | ||
| + | </ | ||
| + | |||
| + | И все равно, если мы запустим код ничего не произойдет. Он работает корректно, | ||
| + | |||
| + | Дополним наш код. Добавим в класс Vehicle метод '' | ||
| + | |||
| + | <code python> | ||
| + | class Vehicle: | ||
| + | """ | ||
| + | |||
| + | def __init__(self, | ||
| + | """ | ||
| + | print(' | ||
| + | self.color = color | ||
| + | |||
| + | red_car = Vehicle() | ||
| + | green_car = Vehicle() | ||
| + | blue_car = Vehicle() | ||
| + | </ | ||
| + | |||
| + | Обратите особое внимание на метод '' | ||
| + | |||
| + | Так же метод '' | ||
| + | |||
| + | <code python> | ||
| + | red_car = Vehicle(color=' | ||
| + | green_car = Vehicle(color=' | ||
| + | blue_car = Vehicle(color=' | ||
| + | </ | ||
| + | |||
| + | Если напечатать на экран значение переменной, | ||
| + | |||
| + | <code python> | ||
| + | print(red_car.color) | ||
| + | print(green_car.color) | ||
| + | print(blue_car.color) | ||
| + | </ | ||
| + | |||
| + | |||
| + | Так вышло потому, | ||
| + | |||
| + | Расширим метод '' | ||
| + | |||
| + | <code python> | ||
| + | self.noise = ' | ||
| + | </ | ||
| + | |||
| + | Можно, конечно, | ||
| + | |||
| + | <code python> | ||
| + | def drive(self): | ||
| + | print(self.noise) | ||
| + | </ | ||
| + | |||
| + | Вызвать этот метод можно написав: | ||
| + | |||
| + | <code python> | ||
| + | red_car.drive() | ||
| + | </ | ||
| + | |||
| + | Всякий раз когда мы будем вызывать метод Питон будет печатать на экран звук движения машины. Вся наша программа сейчас должна выглядеть вот так: | ||
| + | |||
| + | <code python> | ||
| + | class Vehicle: | ||
| + | """ | ||
| + | |||
| + | def __init__(self, | ||
| + | """ | ||
| + | print(' | ||
| + | self.color = color | ||
| + | self.noise = ' | ||
| + | | ||
| + | def drive(self): | ||
| + | print(self.noise) | ||
| + | | ||
| + | red_car = Vehicle(color=' | ||
| + | green_car = Vehicle(color=' | ||
| + | blue_car = Vehicle(color=' | ||
| + | |||
| + | print(red_car.color) | ||
| + | print(green_car.color) | ||
| + | print(blue_car.color) | ||
| + | |||
| + | red_car.drive() | ||
| + | </ | ||
| + | |||
| + | ===== Наследование ===== | ||
| + | |||
| + | Наследование это способ уменьшить дублирование и переиспользовать код. В терминах предков-потомков, | ||
| + | |||
| + | <code python> | ||
| + | class ElectricCar(Vehicle): | ||
| + | """ | ||
| + | def charge(self): | ||
| + | print(' | ||
| + | |||
| + | electric_car = ElectricCar() | ||
| + | electric_car.charge() | ||
| + | electric_car.noise = ' | ||
| + | electric_car.drive() | ||
| + | |||
| + | </ | ||
| + | |||
| + | Во время описания класса электромобиля мы указали имя класса Vehicle в скобках. Это инструкция Питону считать класс ElectricCar потомком или подклассом класса Vehicle. Это дает доступ до данных и методов, | ||
| + | |||
| + | Электромобиль имеет так же свои методы. Он может заряжаться (этого другие машины не умеют). И издает другой звук при движении. Обратите внимание, | ||