Similar presentations:
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 можно
почитать здесь.
programming