мета-данные страницы
Загрузка не удалась. Возможно, проблемы с правами доступа?
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
python:week22 [21/01/2019 01:00] – [Абстракция] 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. | ||
В те времена процедуры записывались на перфокартах. На каждом шаге данные читались, | В те времена процедуры записывались на перфокартах. На каждом шаге данные читались, | ||
Строка 42: | Строка 38: | ||
Все эти переменные и методы хранятся в пределах объекта Слон. Так как они сокрыты, | Все эти переменные и методы хранятся в пределах объекта Слон. Так как они сокрыты, | ||
+ | |||
+ | ===== Наследование ===== | ||
+ | |||
+ | В дополнение к классам, | ||
+ | |||
+ | Создание подклассов позволяет экономить время. Вместо создания новых классов для всего программист создает базовый класс и затем расширяет его новыми подклассами по мере необходимости. | ||
+ | |||
+ | ===== Полиморфизм ===== | ||
+ | |||
+ | Полиморфизм это следствие наследования. Чтобы полностью его понять потребуется некоторый опыт в программировании, | ||
+ | |||
+ | Например, | ||
+ | |||
+ | В этом случае, | ||
+ | |||
+ | ===== Резюме ===== | ||
+ | |||
+ | Прочитанное наверняка вызывает больше вопросов об ООП чем дает ответов. Перечислим кратко основное: | ||
+ | |||
+ | * ООП собирает информацию в единую сущность, | ||
+ | * Каждый объект это конкретный экземпляр класса. | ||
+ | * Абстракция скрывает внутренние механизмы объекта, | ||
+ | * Инкапсуляция хранит и защищает соответствующие переменные и методы внутри объекта. | ||
+ | * Наследование позволяет подклассам использовать атрибуты родительских классов. | ||
+ | * Полиморфизм позволяет объектам и методам работать с разными ситуациями с помощью одного интерфейса. | ||
+ | |||
+ | Если запомните эти пункты, | ||
+ | |||
+ | ====== ООП в Питоне ====== | ||
+ | |||
+ | ===== Классы ===== | ||
+ | |||
+ | Класс это базовый строительный блок в ООП. Можно считать класс шаблоном или чертежом объекта, | ||
+ | |||
+ | <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. Это дает доступ до данных и методов, | ||
+ | |||
+ | Электромобиль имеет так же свои методы. Он может заряжаться (этого другие машины не умеют). И издает другой звук при движении. Обратите внимание, |