1.02M
Категория: ПрограммированиеПрограммирование

+Лекция 10

1.

Введение в объектно-ориентированное
программирование (ООП)
Лекция 10

2.

Несмотря на то, что Python - мультипарадигменный язык (сочетает
в себе элементы структурного, объектно-ориентированного и
функционального программирования), основной парадигмой все-таки
является ООП.
... в Python все является объектом!
Строки - это объекты.
Списки являются объектами.
Функции являются объектами.
Классы являются объектами.
Экземпляры класса являются объектами.
Свойства являются объектами.
Модули являются объектами.
Файлы являются объектами.
Сетевые подключения являются объектами и тд

3.

Э. Дейкстра: «Человечество еще в древности придумало
способ управления сложными системами: «разделяй и
властвуй»».
Структурное программирование:
декомпозиция по
задача
задачам
подзадача 1
подзадача 2.1
подзадача 2
подзадача 2.2
подзадача 3
подзадача 2.3
человек мыслит
иначе, объектами

4.

существенные
свойства
Абстракция – это выделение существенных свойств
объекта, отличающих его от других объектов.
! Разные цели –
разные модели!

5.

Программа – множество объектов (моделей), каждый из которых
обладает своими свойствами и поведением, но его внутреннее
устройство скрыто от других объектов.
! Нужно «разделить» задачу на объекты!
А
В
Б
Б1
В1
Б2
В2
В3
Б3
Г
Г1
Г2
декомпозиция по
объектам

6.

Цель объектно-ориентированного подхода - основываясь на
модели черного ящика, разбить программу (декомпозировать) на
достаточное количество классов и модулей, каждый из которых
предназначен для выполнения одной четко очерченной задачи,
которую будет выполнять отдельный объект.
Плюсы данного подхода заключаются в том, что декомпозиция
позволяет:
• упростить архитектуру приложения (фактически, сделав ее
абстракцией реального мира);
• облегчить командную разработку (каждый разработчик занят
работой над отдельным объектом кода и при взаимодействии с
другими объектами ему нужно знать лишь «что объект делает», без
необходимости узнавать «как он это делает»).

7.

8.

Объектно-ориентированный анализ (ООА):
• выделить объекты
• определить их существенные свойства
• описать поведение (команды, которые они могут выполнять)
? Что такое объект?
Объектом можно назвать то, что имеет чёткие границы и обладает
состоянием и поведением.
Состояние определяет поведение:
• лежачий человек не прыгнет
• незаряженное ружье не выстрелит
Класс – это множество объектов, имеющих общую структуру и общее
поведение.

9.

Основные понятия ООП
Объектно-ориентированное
программирование
методология
(парадигма) программирования, основанная на представлении
программы в виде совокупности объектов, каждый из которых является
экземпляром определенного класса, а классы образуют иерархию
наследования. В программе при этом в качестве основных логических
конструктивных элементов используются объекты, а не алгоритмы.
1.Класс (англ. Class): абстракция реального мира (обобщенный шаблон),
специальный тип данных; класс описывает свойства и методы, которые
могут быть доступны у подобных объектов;
2.Объект (англ. Object) (экземпляр класса, англ. Class Instance): частный
случай класса.

10.

Каждый класс содержит и описывает поля и методы:
1.Поле (англ. Data Member / Variable / Field): переменная,
привязанная к классу;
2.Метод (англ. Method): действие (функция), которую можно
проводить над классом.
3.В Python традиционно поля и методы вместе называются
атрибутами (членами) класса. Доступ к члену класса можно
получить через '.' . Например, класс str хранит строки символов
Юникода в виде данных и поддерживает методы, такие как
str.count().

11.

Как поля так и методы могут иметь разный уровень доступа область видимости (англ. Scope)
Таблица 10.1.1 - Область видимости полей и методов
Доступность
Уровень доступа (тип)
Внутри самого класса
Внутри
наследников
классов-
Извне (любой код)
Закрытый / приватный
Да
(англ. Private)
Нет
Нет
Защищенный
(англ. Protected)
Да
Да
Нет
Открытый / публичный
Да
(англ. Public)
Да
Да

12.

Основные задачи объектноориентированного программирования
• структурировать информацию и не допускать путаницы;
• точно определять взаимодействие одних элементов с
другими;
• повышать управляемость программы;
• быстрее масштабировать код под различные задачи;
• лучше понимать написанное;
• эффективнее поддерживать готовые программы;
• внедрять изменения без необходимости переписывать
весь код.

13.

Проектирование программы
В ООП очень важно предварительное проектирование. В общей сложности
можно выделить следующие этапы разработки объектно-ориентированной
программы:
Формулирование задачи.
1.Определение объектов, участвующих в ее решении.
2.Проектирование классов, на основе которых будут создаваться объекты. В
случае необходимости установление между классами наследственных связей.
3.Определение ключевых для данной задачи свойств и методов объектов.
4.Создание классов, определение их полей и методов.
5.Создание объектов.
6.Решение задачи путем организации взаимодействия объектов.

14.

Классы
• Так как Python поддерживает объектно-ориентированную
парадигму программирования, это значит, что мы можем определить
компоненты программы в виде классов.
• Класс является шаблоном или формальным описанием объекта, а
объект представляет экземпляр этого класса, его реальное
воплощение.
• Можно провести следующую аналогию: у всех у нас есть некоторое
представление о человеке - наличие двух рук, двух ног, головы,
пищеварительной, нервной системы, головного мозга и т.д. Есть
некоторый шаблон - этот шаблон можно назвать классом. Реально
же существующий человек (фактически экземпляр данного класса)
является объектом этого класса.

15.

Пример создания класса
Класс
Объект
Наконец, действия, которые может совершать
автомобиль, либо же действия, которые могут
совершаться над автомобилем – это методы
класса.
«Моя машина»
Марка – Toyota
Модель – Corolla
Цвет – синий
Текущая скорость – 0
Свойства
Завести двигатель
Увеличить/уменьшить скорость
Повернуть
Методы

16.

Классы
Класс определяется с помощью ключевого слова class:
class название_класса:
методы_класса
Для создания объекта класса используется следующий
синтаксис:
название_объекта = название_класса([параметры])

17.

Определение класса на языке Python с помощью оператора class:
class MyClass:
def __init__(self, arg):
"""Конструктор"""
self._arg = arg # параметр объекта
def method1(self, x):
"""метод, входящий в интерфейс класса"""
def _method2(self, x):
"""метод, не входящий в интерфейс класса"""
def __method2(self, x):
"""метод доступный только внутри класса"""
@staticmethod
def method3(arg1, arg2, ...):
"""статический метод, доступный для вызова как из экземпляров класса, так и из самого класса"""
@classmethod
def method4(cls, arg1, arg2, ...):
"""метод класса, доступный для вызова как из экземпляров класса, так и из самого класса, с доступом к внутренним
методам и параметрам"""
Создание экземпляра класса: myinstance = MyClass(4)
Уничтожение экземпляра класса в явном виде не требуется, так как в Python присутствует автоматический «сборщик мусора».
Однако в явном виде удалить ссылку на объект (экземпляр класса или сам класс) можно так: del myinstance

18.

Пример
• Определим простейший класс Person, который будет представлять человека:
class Person:
name = "Tom"
def display_info(self):
print("Привет, меня зовут", self.name)
person1 = Person()
person1.display_info()
# Привет, меня зовут Tom
person2 = Person()
person2.name = "Sam"
person2.display_info()
# Привет, меня зовут Sam

19.

Пояснение
Класс Person определяет атрибут name, который хранит имя человека, и метод
display_info, с помощью которого выводится информация о человеке.
• В Python self — это переменная, которая используется в методах класса для ссылки на
сам объект. self позволяет получить доступ к атрибутам и методам объекта внутри его
класса, а также отличать внутренние переменные объекта от других переменных.
Когда мы создаём метод внутри класса, первым параметром этого метода всегда
должен быть self. Это нужно для того, чтобы при вызове метода объект передавал себя
в этот параметр автоматически, позволяя методу знать, с каким экземпляром класса он
работает.
После определения класс Person создаем пару его объектов - person1 и person2.
Используя имя объекта, мы можем обратиться к его методам и атрибутам. В данном
случае у каждого из объектов вызываем метод display_info(), который выводит строку
на консоль, и у второго объекта также изменяем атрибут name. При этом при вызове
метода display_info не надо передавать значение для параметра self.

20.

Конструктор
• В объектно-ориентированном программировании конструктором
класса называют метод, который автоматически вызывается при
создании объектов.
• Его также можно назвать конструктором объектов класса. Имя такого
метода обычно регламентируется синтаксисом конкретного языка
программирования.
• Необходимость конструкторов связана с тем, что нередко объекты
должны иметь собственные свойства сразу.
• Однако бывает, что надо допустить создание объекта, даже если
никакие данные в конструктор не передаются. В таком случае
параметрам конструктора класса задаются значения по умолчанию:

21.

Конструкторы
• Так, выше когда мы создавали объекты класса Person, мы
использовали конструктор по умолчанию, который неявно имеет все
классы:
person1 = Person()
person2 = Person()
Однако мы можем явным образом определить в классах
конструктор с помощью специального метода, который называется
__init(). К примеру, изменим класс Person, добавив в него конструктор:

22.

class Person:
# конструктор
def __init__(self, name):
self.name = name # устанавливаем имя
def display_info(self):
print("Привет, меня зовут", self.name)
person1 = Person("Tom")
person1.display_info()
# Привет, меня зовут Tom
person2 = Person("Sam")
person2.display_info()
# Привет, меня зовут Sam

23.

Пояснение
В качестве первого параметра конструктор также принимает ссылку
на текущий объект - self. Нередко в конструкторах устанавливаются
атрибуты класса. Так, в данном случае в качестве второго параметра в
конструктор передается имя пользователя, которое устанавливается
для атрибута self.name. Причем для атрибута необязательно
определять в классе переменную name, как это было в предыдущей
версии класса Person. Установка значения self.name = name уже неявно
создает атрибут name.
person1 = Person("Tom")
person2 = Person("Sam")
• В итоге мы получим следующий консольный вывод:

24.

Деструктор
После окончания работы с объектом мы можем использовать
оператор del для удаления его из памяти:
person1 = Person("Tom")
del person1 # удаление из памяти
# person1.display_info() # Этот метод работать не будет, так как
person1 уже удален из памяти
• Стоит отметить, что в принципе это необязательно делать, так
как после окончания работы скрипта все объекты
автоматически удаляются из памяти.

25.

Деструктор
Кроме того, мы можем определить в классе деструктор,
реализовав встроенную функцию __del__, который будет
вызываться либо в результате вызова оператора del, либо при
автоматическом удалении объекта.
Например:

26.

class Person:
# конструктор
def __init__(self, name):
self.name = name # устанавливаем имя
def __del__(self):
print(self.name,"удален из памяти")
def display_info(self):
print("Привет, меня зовут", self.name)
person1 = Person("Tom")
person1.display_info() # Привет, меня зовут Tom
del person1
# удаление из памяти
person2 = Person("Sam")
person2.display_info() # Привет, меня зовут Sam
del person2

27.

Определение классов в модулях и
подключение
• Как правило, классы размещаются в отдельных модулях и затем
уже импортируются в основой скрипт программы. Пусть у нас
будет в проекте два файла: файл main.py (основной скрипт
программы) и classes.py (скрипт с определением классов).

28.

Определение класса
• В файле classes.py определим два класса:
class Person:
# конструктор
def __init__(self, name):
self.name = name # устанавливаем имя
def display_info(self):
print("Привет, меня зовут", self.name)
class Auto:
def __init__(self, name):
self.name = name
def move(self, speed):
print(self.name, "едет со скоростью", speed, "км/ч")

29.

В дополнение к классу Person здесь также определен класс Auto, который
представляет машину и который имеет метод move и атрибут name.
Подключим эти классы и используем их в скрипте main.py:
from classes import Person, Auto
tom = Person("Tom")
tom.display_info()
bmw = Auto("BMW")
bmw.move(65)

30.

Подключение классов
• Подключение классов происходит точно также, как и функций из
модуля. Мы можем подключить весь модуль выражением
• Либо подключить отдельные классы, как в примере выше.
• В итоге мы получим следующий консольный вывод:

31.

Преимущества ООП
Объектно-ориентированное программирование как другие парадигмы имеет свои преимущества и
недостатки.
Преимущества
1.Улучшение производительности разработки ПО.
ООП способствует модульности, расширяемости и повторному использованию кода (за счет аспекта
наследования и полиморфизма).
2.Улучшение сопровождения ПО.
Благодаря модульности, расширяемости и повторному использованию кода его легче поддерживать.
3.Ускорение разработки.
Повторное использование кода позволяет выполнять разработку быстрее, в т.ч. в смежных проектах.
4.Снижение стоимости разработки.
Повторное использование кода также позволяет снизить издержки и сосредоточиться на
объектно-ориентированном анализе и проектировании, снижающем общую стоимость ПО.
5.Повышение качества ПО.
Ускорение разработки и снижение затрат позволяет уделить больше времени и ресурсов на
тестирование ПО.

32.

Недостатки ООП
Недостатки
1.Крутая кривая обучения.
Мышление в ООП-стиле требует определенных навыков, а переход от
императивного стиля на взаимодействие объектов может потребовать
времени.
2.Больший объем кода.
Как правило, ООП приводит появлению большего количества кода,
нежели в императивном программировании.
3.Медленные программы.
ООП-программы чаще выполняются медленнее, т.к. содержат больше
кода для выполнения.
4.ООП не подходит для всех случаев.
Ряд задач могут лучше решаться в императивном, логическом или
функциональном стиле, где использование ООП не даст выигрыша.

33.

Пример класса CAR
class Car:
# создаем класс "Автомобиль”
# описываем свойства класса
mark = 'Toyota'
# марка
model = 'Corolla'
# модель
color = 'blue'
# цвет
speed = 0
# скорость
my_car_1 = Car()
# создаем экземпляр класса Car
# выводим на экран все свойства объекта my_car_1
print(f'Марка автомобиля:{my_car_1.mark}')
print(f'Модель автомобиля:{my_car_1.model}')
print(f'Цвет автомобиля:{my_car_1.color}')
print(f'Текущая скорость:{my_car_1.speed}')
my_car_1.color = 'red'
# меняем значение свойства сolor
my_car_2 = Car()
# создаем еще один экземпляр класса
Car
# выводим на экран все свойства объекта my_car_2
print(f'Марка автомобиля:{my_car_2.mark}')
print(f'Модель автомобиля:{my_car_2.model}')
print(f'Цвет автомобиля:{my_car_2.color}')
print(f'Текущая скорость:{my_car_2.speed}')

34.

Практика
1. Создайте класс «Animal» с тремя атрибутами и двумя методами.
Создайте подклассы « Elefant», «Dog», «Cat» с дополнительными
атрибутами и методами (свойственными каждому животному).
Выведите информацию о них на экран.
2. Создайте класс Person, подкласс Student, у студентов есть
средний балл по успеваемости. Создайте несколько объектов этого
класса. Выведите на экран информацию о них с указанием получат
ли они стипендию в следующем семестре (если средний балл >=4)
English     Русский Правила