5.25M
Category: programmingprogramming

Python основы ООП

1.

Python
Основы ООП
с использованием иллюстраций и материалов, подготовленных Кондюриной А.А.

2.

Что такое ООП?
Объектно-ориентированное программирование (ООП)
— парадигма программирования, в которой программа
представляет собой совокупность взаимодействующих
объектов.

3.

Классы и объекты
Класс - тип данных, описывающий устройство объектов.
Объект - конкретный экземпляр класса.

4.

И как их делать?
class Имя_класса:
# определение атрибутов и методов класса
объект = Имя_класса() # создание объекта класса
class A:
arg = 5 # поле класса
a = A() # создание объекта класса
a.arg = 1 # доступ к полю через точку, изменяем значение
print(a.arg) # 1
# Имена классов принято писать с заглавной буквы вот так: MyClass

5.

Что внутри класса?
Атрибут – значение (свойство, параметр), определенное
внутри класса.
Метод – функция (действие), определенная внутри класса.
self — это первый формальный параметр метода класса,
который содержит ссылку на тот объект, который вызывает
метод.
class MyClass():
def my_method(self,n):
self.x =n**2
my_object=MyClass()
my_object.my_method(5)
print(my_object.x) # 25

6.

Атрибуты и методы
class B:
value = 42
def get_value(self):
return self.value
def print_sum(self, num): # передача параметра
print(self.get_value() + num)
# передача параметра со значением по умолчанию
def print_string(self, string='Hello World!'):
print(string)
b = B() # создание объекта
b_val = b.get_value() # вызов метода
print(b_val) # 42
b.print_sum(123) # 42 + 123 = 165
b.print_string('YOLO') # YOLO
b.print_string() # Hello World!

7.

Конструктор
Часто при создании объекта необходимо сразу задать значения
всем (или части) его атрибутов. Для этого внутри класса
описывается специальный метод.
Конструктор класса — это метод класса, который вызывается
при создании экземпляра класса. Необходим для задания
значения атрибутам экземпляра класса.
class Point:
# конструктор класса с параметрами
def __init__(self, x, y, z):
self.coord = (x, y*2, z*3)
p = Point(0.0, 1.0, 0.0) # вызов конструктора

8.

Атрибуты
Атрибут экземпляра класса — атрибут, определенный внутри
метода класса, принадлежащий только к этому экземпляру.
Сюда относятся атрибуты:
1. Определенные в конструкторе:
def __init__(self):
self.atr = 42
2. Определенные после создания объекта:
имя_объекта.атрибут = 42

9.

Атрибуты
Атрибут класса — атрибут, доступный для всех экземпляров
данного класса. Определяется внутри класса, но вне любых
методов класса.
Может быть доступен:
1. Через имя класса:
ИмяКласса.атрибут
2. Через объект класса, если у объекта нет атрибута с таким же
именем:
имя_объекта.атрибут

10.

Атрибуты
class Figure:
# атрибут класса. сколько всего элементов создано
count = 0
# конструктор класса. вызывается при создании экземпляра
def __init__(self, name, color):
# атрибуты экземпляра класса, их значения доступны только
объекту
self.color = color
self.name = name
# увеличиваем значение переменной класса
Figure.count += 1
def info(self):
print('Имя: ', self.name,
'\nЦвет: ', self.color,
'\nВсего фигур: ', Figure.count)

11.

Атрибуты
red_figure = Figure('Фигура красная', 'Красный')
red_figure.info() # Всего фигур: 1
white_figure = Figure('Фигура белая', 'Красный')
white_figure.info() # Всего фигур: 2
Атрибут класса count общий для всех экземпляров класса.
a = Figure('Фигура красная', 'Красный')
a.count = 123
b = Figure('Фигура красная', 'Красный')
print(a.count, b.count) # 123 2
А теперь у объекта a свой атрибут экземпляра класса count.

12.

Принципы ООП

13.

Принципы ООП
Инкапсуляция
Абстракция
Наследование
Полиморфизм

14.

Инкапсуляция

15.

Инкапсуляция
Инкапсуляция – упаковка атрибутов и методов в
единый компонент (капсулу).
Инкапсуляция != сокрытие.
Часто под инкапсуляцией понимают скрытие от
пользователя алгоритма работы объекта. Видимым остается
только интерфейс, при помощи которого происходит
взаимодействие с объектом.

16.

Инкапсуляция
Для языков C++ и Java инкапсуляция без сокрытия
рассматривается, как не полноценная. В Python
инкапсуляция реализована в полной мере, но отсутствует
возможность скрытия в принципе.
Интерфейс класса – программная структура,
описывающая элементы и принципы взаимодействия с
объектами.
В Python соблюдение инкапсуляции зависит только от
программиста. Скрытие данных установлено только на
уровне соглашения (т.е. не обязательно к исполнению), о
том, какие атрибуты являются доступными, а какие –
скрытыми.

17.

Инкапсуляция
1) одиночное подчеркивание перед именем атрибута или
метода – не предназначены для использования вне методов
класса, но доступны по имени.
2) двойное подчеркивание – не доступны по имени, но
доступны под именем _ИмяКласса__имяАтрибута.
class Class:
x=1
_x = 2
__x = 3 # этот атрибут доступен по имени '_Class__x'
object = Class()
print(object.x)
print(object._x)
print(object._Class__x) #обращение object.__x вызовет исключение

18.

Инкапсуляция
Дескриптор – объект, доступ к которому через
атрибут переопределен методами.
Метод чтения, геттер (англ. getter) - метод, позволяющий
получить данные, доступ к которым напрямую ограничен.
Устанавливающий метод, сеттер (англ. setter) - метод,
используемый для того, чтобы присвоить значение
сокрытому полю, например, обработав при этом
недопустимые присваивания.
Привязка методов к атрибуту осуществляется с помощью
функции property().
Свойство = property(Чтение[, Запись, Удаление, Строка
документирования])

19.

Инкапсуляция
class C(object):
def getx(self):
return self.__x
def setx(self, value):
self.__x = value
def delx(self):
del self.__x
x = property(getx, setx, delx, "I'm the 'x' property.")
c = C()
c.x = 1 # вызывается setx
print(c.x) # вызывается getx
del c.x # вызывается delx

20.

Абстракция

21.

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

22.

Абстракция
Декомпозиция – разделение одного сложного объекта
на несколько простых.

23.

Наследование

24.

Наследование
Наследование – возможность передачи атрибутов и
методов одного класса другим.
Родительский класс (надкласс, базовый класс или
суперкласс (англ. base class, parent class)) - это класс, от
которого наследуются атрибуты и методы.
Дочерний класс (производный класс, класс потомок или
подкласс (англ. derived class, subclass)) - это класс,
наследующий методы и атрибуты родительского.
class ИмяРодительскогоКласса:
Атрибуты
Методы()
class ИмяДочернегоКласса(ИмяРодительскогоКласса):
...

25.

Наследование

26.

Наследование
class Parent: # родитель
a = 42
class Child(Parent): # потомок
b = 256
parent = Parent() # создаем экземпляр базового класса
print(parent.a) # обращаемся к атрибуту экземпляра базового класса
child = Child() # создаем экземпляр производного класса
print(child.a) # обращаемся к атрибуту экземпляра производного класса
print(child.b) # обращаемся к атрибуту экземпляра производного класса
print(dir(parent)) # ['__class__', ..., '__init__', ..., 'a']
print(dir(child)) # ['__class__', ..., '__init__', ..., 'a', 'b']
# переопределим наследованный атрибут
child.a = "Hello"
print(parent.a)
print(child.a)

27.

Наследование
Переопределение методов – возможность дочернего
класса создать свою реализацию метода, определенного в
родительском классе. При этом доступ к объектам базового
класса можно получить при помощи метода super().
class Figure:
count = 0
def __init__(self, name, color):
self.color = color
self.name = name
Figure.count += 1
def print_info(self):
print('Имя: ', self.name,
'\nЦвет: ', self.color,
'\nВсего фигур: ', Figure.count)

28.

Наследование
class Circle(Figure):
def __init__(self, name, color, point, radius):
# В дочернем классе необходимо вызвать метод инициализации
родителя.
super().__init__(name, color)
# инициализируем поля объекта класса потомка
self.point = point
self.radius = radius
def print_info(self):
# переопределяем метод базового (родительского) класса
# вызов метода базового класса
super().print_info()
print('\nРадиус: ', self.radius,
'\nВсего фигур: ', Figure.count)

29.

Наследование
# main
red_figure = Figure('Фигура красная', 'Красный')
red_figure.print_info()
circle = Circle('Круг 1', 'Белый', (10, 12), 5)
circle.print_info()

30.

Наследование
В языке Python во главе иерархии классов стоит класс object.
Функция issubclass(X, Y) может сказать, является ли класс X
производным (то есть потомком) от базового класса Y.
Принадлежность объекта а классу b можно выяснить с
помощью функции isinstance(a, b).

31.

Наследование
class Parent(object): # object можно не указывать
pass
class Child(Parent):
pass
issubclass(Parent, object) # True
issubclass(Child, Parent) # True
issubclass(Child, object) # True
issubclass(Child, str) # False
issubclass(Parent, Parent) # класс является подклассом самого себя
parent = Parent()
isinstance(parent, Parent) # True

32.

Абстрактные классы
Абстрактный класс - это класс, предназначенный только для
наследования. Его экземпляры обычно не имеют смысла.
Абстрактный
класс
необходим
как
декларация
функциональности некоторого типа, реализация которой
делегируется классу потомку.
class Figure:
count = 0
def __init__(self, name, color):
self.color = color
self.name = name
Figure.count += 1
def print_info(self):
pass
def get_square(self):
pass

33.

Абстрактные классы
class Circle(Figure):
def __init__(self, name, color, point, radius):
super().__init__(name, color)
self.point = point
self.radius = radius
def print_info(self):
print('Имя: ', self.name,
'\nЦвет: ', self.color,
'\nВсего фигур: ', Figure.count,
'\nРадиус: ', self.radius,
'\nВсего фигур: ', Figure.count)
def get_square(self):
return 2*math.pi*self.radius

34.

Множественное наследование
Множественное наследование - производный класс может
иметь более, чем один базовый класс.
class A:
def a(self): return 'a'
class B:
def b(self): return 'b'
class C:
def c(self): return 'c'
class AB(A, B):
pass
class BC(B, C):
pass
class ABC(A, B, C):
pass

35.

Множественное наследование
Стрекодил (крокоза)

36.

Разрешение методов
Порядок разрешения методов (Method resolution order) - это
алгоритм, который определяет, какой метод вызвать в дочернем
классе, в случае, когда базовые классы имеют методы с
одинаковыми именами.

37.

Миксины
Миксин (mixin, в пер. “примесь”) - класс, добавляющий в
другой класс какую-либо черту поведения (привнесением
атрибутов). Примеси обычно являются абстрактными классами.
class Authorization:
is_enabled = True
type = 'password'
class User(Authorization):
def get_info(self):
if (super().isEnabled):
# запросить пароль

38.

Полиморфизм
У каждого из нас своя реализация,
Главное - кем быть, можно по всякому называться,
Полиморфизм: Человек.сказать(слово)
Каждый может по-своему и это так клево.
#НТР -- Полиморфизм

39.

Полиморфизм
Полиморфизм (греч. «имеющий многие формы») возможность метода с одним и тем же именем выполнять
различные действия в различных классах.

40.

Полиморфизм
class T1:
n=10
def total(self, N):
self.total = int(self.n) + int(N)
class T2:
def total(self,s):
self.total = len(str(s))
t1 = T1()
t2 = T2()
t1.total(45)
t2.total(45)
print(t1.total) # Вывод: 55
print(t2.total) # Вывод: 2

41.

Полиморфизм
Полиморфизм дает возможность реализовывать так
называемые единые интерфейсы для объектов различных классов.
Например, разные классы могут предусматривать различный
способ вывода той или иной информации объектов. Однако
одинаковое название метода вывода позволит не запутать
программу, сделать код более ясным.

42.

Полиморфизм
class Animal:
def __init__(self, name): # Конструктор
self.name = name
def talk(self): # Абстрактный метод
pass
class Cat(Animal):
def talk(self):
return 'Meow!'
class Dog(Animal):
def talk(self):
return 'Woof! Woof!'
animals = [Cat('Missy'), Cat('Mr. Mistoffelees'), Dog('Lassie')]
for ani in animals:
print ani.name + ': ' + ani.talk()

43.

Полиморфизм
В Python полиморфизм также используется для
перегрузки стандартных операторов.
__lt__() -- для <
__le__() -- для <=
__ne__() -- для !=
__eq__() -- для ==
__ge__() -- для >=
__gt__() -- для >
Полный перечень методов класса object можно
почитать здесь.
English     Русский Rules