---
title: Вступ до ООП. Об'єкти та класи
tags: Python
type: slide
source: https://hackmd.io/-eqoW1arSk2Ft2zQ8YCteA
slideOptions:
allottedMinutes: 85
theme: beige
slideNumber: c
spotlight:
enabled: true
---
## Вступ до ООП. Об'єкти та класи
<img src="https://content.hneu.edu.ua/uploads/upload_de64ad7158e5d3e4f19b654e50ad1eff.png" width="25%" style="border: 0;">
[доц. Яценко Р.М.](http://linkedin.com/in/yatsenkorm)
----
### Презентація
<img src="https://content.hneu.edu.ua/uploads/upload_7204d2beba808fe36917c28765e7acb5.png" width="30%" style="border: 0;">
https://is.gd/2rhorP
----
### Зміст
1. [Процедурний та об’єктно-орієнтований стилі програмування](#/1)
2. [Поняття про класи та об’єкти](#/2)
3. [Інкапсуляція](#/3)
4. [Статичні атрибути та методи](#/4)
---
## 1. Процедурний та об'єктно-орієнтований стилі програмування
----
### Процедурний стиль програмування
- був домінуючим підходом під час розробки програмного забезпечення протягом десятиліть
- добре працює для окремих типів проектів (наприклад, для задач обчислювальної математики)
- не підходить для складних проектів, результати роботи яких оточують нас у сучасному комп’ютерному світі
----
### Недоліки
- Алгоритми і структури даних
- функції, що об'єднуються в модулі
- змінні різних типів даних
- Незахищеність даних
- потрібно контролювати правильний зв'язок дані-функції
----
### Об’єктно-орієнтований підхід
- Дані і код об’єднуються разом у єдину структуру – *об’єкт*
- Дозволяє описати сутності реального світу у вигляді об’єктів, а також організувати зв’язки між ними
- Правильно побудований об’єкт здатен захистити свої дані від несанкціонованого використання чи модифікації
----
Об'єктно-орієнтоване програмування (ООП)
: це парадигма програмування, яка розглядає програму як множину "об'єктів", що взаємодіють між собою
*Основна мета ООП* -- забезпечити повторне виконання існуючого програмного коду та спростити програмування піднявши його на новий рівень абстракції
----

---
## 2. Поняття про класи та об’єкти
----
### Клас та об'єкт
Клас
: це абстракція, що описує спільну поведінку та властивості подібних сутностей
Об’єкт
: це певна сутність, що має визначені властивості, стан та поведінку
----
### Пояснення
- Клас -- це шаблон, за яким будують конкретний об’єкт
- Створені об’єкти на основі цього класу є екземплярами класу
- Клас описує властивості, що притаманні всім його об’єктам та визначає шаблони їхньої поведінки
- Клас не має визначеного стану -- стан визначено для екземплярів класу
----
### Приклади
- *Університет* є класом
- *Харківський національний економічний університет імені Семена Кузнеця* є екземпляром об'єкта
- *Інститут* є класом
- *Інститут інформаційних технологій* є екземпляром об'єкта
----
### Атрибути та методи
Атрибут (поле, властивість)
: змінна пов’язана з класом або об’єктом
Метод
: підпрограма, що використовується виключно разом із класом (метод класу) або екземпляром класу (метод екземпляру)
Сукупно атрибути та методи називають *членами класу*
----
### Приклади
Клас/об’єкт автомобіль має властивості:
- марка
- модель
- колір
- потужність двигуна
- максимальна швидкість
----
Стан об’єкта визначається поточними значеннями атрибутів:
- марка = Toyota
- модель = Corolla
- колір = білий
- потужність двигуна = 150 к.с.
- максимальна швидкість = 190 км/год
----
Методи визначають поведінку об’єкта або змінюють його стан:
- їхати
- гальмувати
- увімкнути світло
- поповнити пальне у бензобаку
----
### Абстракція та абстрагування
Абстрагування
: спосіб виділити набір вагомих характеристик об’єкта та шаблонів поведінки, які чітко визначають його концептуальні межі, що відрізняють його від інших об’єктів
Абстракція
: набір характеристик об’єкта та шаблонів поведінки, що виникає в результаті абстрагування
----
### Створення класу
```python=
class NewClass:
def method1(self, arg1, ..., argN1):
method1_body
def method2(self, arg1, ..., argN2):
method2_body
...
def method_M(self, arg1, ..., argNM):
method_M_body
```
----
### Особливості методів
- метод завжди першим параметром має обов’язковий параметр, що є посиланням на екземпляр класу, з якого викликається метод. За домовленістю цей аргумент має ім’я `self`
- методи можуть містити описи (оголошення) атрибутів, що починаються зі спеціального префіксу `self.`:
```python
self.a = 10 # створення атрибуту a зі значенням 10
```
----
### Конструктор
Конструктор (constructor)
: спеціальний метод класу, який автоматично викликається при створенні об'єкта та призначений для ініціалізації його атрибутів
```python=
class NewClass:
def __init__(self, par1, ..., parN):
""" This method is constructor """
pass
```
----
### Деструктор
Деструктор (destructor)
: спеціальний метод класу, який викликається автоматично при знищенні об'єкта і призначений для його деініціалізації
```python
class NewClass:
...
def __del__(self):
"""This method is destructor"""
...
```
Список формальних параметрів деструктора завжди складається тільки з `self`
----
### Створення та знищення об’єктів
- Після створення класу, можна створити екземпляр (об’єкт) цього класу:
```python
obj = NewClass(arg1, ..., argN)
```
- Під час створення об’єкта, неявно викликається метод-конструктор:
```python
obj.__init__(arg1, ..., argN)
```
- Деструктор неявно викликається під час завершення роботи програми або під час явного знищення об’єкту:
```python
del obj
```
----
### Приклад 1. Клас Notifier
```python=
class Notifier:
def __init__(self):
print("Notifier: Екземпляр створено")
def __del__(self):
print("Notifier: Екземпляр знищено")
notifier1 = Notifier() # список аргументів порожній
```
```
Notifier: Екземпляр створено
Notifier: Екземпляр знищено
```
----
### Виклик методів та звернення до полів об’єкту
- Доступ до атрибутів та методів класу здійснюється через посилання на екземпляр класу з використанням «оператору
крапка»:
```python
obj.atribute
obj.method(args)
```
----
### Приклад 2. Клас Notifier (modified)
```python=
class Notifier:
def __init__(self, name):
self.name = name # створюється поле self.name
print(f"Notifier: Екземпляр {self.name} створено")
def __del__(self):
print(f"Notifier: Екземпляр {self.name} знищено")
notifier1 = Notifier("Notifier1")
```
```
Notifier: Екземпляр Notifier1 створено
Notifier: Екземпляр Notifier1 знищено
```
----
### Приклад 3. Клас Triangle
```python=
class Triangle:
def __init__(self, a, b, c):
""" Конструктор трикутника
:param a: перша сторона трикутника
:param b: друга сторона трикутника
:param c: третя сторона трикутника
"""
# перевіримо чи можна створити такий трикутник
assert a + b > c and a + c > b and c + b > a
self.a = a # поле a - перша сторона трикутника
self.b = b # поле b - друга сторона трикутника
self.c = c # поле c - третя сторона трикутника
```
----
```python=14
def perimeter(self):
""" Обчислює периметр трикутника
:return: периметр трикутника
"""
# периметр це сума сторін трикутника
return self.a + self.b + self.c
def square(self):
""" Обчислює площу трикутника за формулою Герона
:return: площу трикутника
"""
p = self.perimeter() / 2.0 # обчислимо напівпериметр
res = p * (p - self.a) * (p - self.b) * (p - self.c)
return res ** 0.5
```
----
```python=29
if __name__ == "__main__":
t = Triangle(3, 4, 5)
print(f"Площа заданого трикутника = {t.square()}")
```
```
Площа заданого трикутника = 6.000000
```
---
## 3. Інкапсуляція
----
Інкапсуляція
: механізм, що полягає у приховуванні від зовнішнього користувача (прикладного програміста, іншого об'єкта тощо) деталей реалізації об'єкта, натомість надаючи механізм взаємодії з об'єктом
- Інкапсуляція -- це механізм об’єднання коду і даних всередині об’єкта, а також їхній захист від непередбачених змін ззовні
- Вона слугує передусім для того, щоб не давати можливості змінювати внутрішній стан об'єкта без його відома
----
Інтерфейс класу
: це набір загальнодоступних полів та методів класу

----
### Приватний та публічний методи
```python=
class A:
def _private(self): # Приватний метод
print("Хей, я приватний метод!")
def public(self): # Публічний метод
print("Все ОК!")
a = A() # Створення екземпляру класу
a._private() # Виклик приватного методу
a.public() # Виклик публічного методу
```
```
Хей, я приватний метод!
Все ОК!
```
----
### "Зовсім" приватний метод
```python=
class A:
def __private(self): # Зовсім приватний метод
print("Хей, я ЗОВСІМ приватний метод!")
a = A()
a.__private()
```
```
AttributeError: 'A' object has no attribute '__private'
```
```python=6
a._A__private() # Виклик методу через модифіковане ім'я
```
```
Хей, я ЗОВСІМ приватний метод!
```
----
### Приклад 4. Клас Triangle з властивостями
```python=
class Triangle:
def __init__(self, a, b=0, c=0):
""" Конструктор трикутника з можливістю копіювання
:param a: перша сторона трикутника або екземпляр класу
:param b: друга сторона трикутника
:param c: третя сторона трикутника
"""
if isinstance(a, Triangle): # гілка копіювання
self._a = a._a
self._b = a._b
self._c = a._c
else:
# перевіримо чи можна створити такий трикутник
assert self.is_exist(a, b, c)
self._a = a ; self._b = b ; self._c = c
```
----
```python=17
def is_exist(self, a, b, c):
""" Перевіряє, чи можна створити
тикутник з заданими сторонами
:param a: перша сторона трикутника
:param b: друга сторона трикутника
:param c: третя сторона трикутника
:return: True, якщо трикутник з сторонами a, b, c існує
"""
return a + b > c and a + c > b and c + b > a
```
----
```python=27
@property
def a(self):
""" Повертає сторону a трикутника
:return: Значення сторони a
"""
return self._a
@a.setter
def a(self, new_a):
""" Встановити сторону a трикутника
:param new_a: сторона трикутника
"""
# перевіримо чи існуватиме такий трикутник
assert self.is_exist(new_a, self._b, self._c)
self._a = new_a
```
----
```python=43
@property
def b(self):
""" Повертає сторону b трикутника
:return: Значення сторони b
"""
return self._b
@b.setter
def b(self, new_b):
""" Встановити сторону b трикутника
:param new_b: сторона трикутника
"""
# перевіримо чи існуватиме такий трикутник
assert self.is_exist(self._a, new_b, self._c)
self._b = new_b
```
----
```python=59
@property
def c(self):
""" Повертає сторону c трикутника
:return: Значення сторони c
"""
return self._c
@c.setter
def c(self, new_c):
""" Встановити сторону c трикутника
:param c: сторона трикутника
"""
# перевіримо чи існуватиме такий трикутник
assert self.is_exist(self._a, self._b, new_c)
self._c = new_c
```
----
```python=75
def perimeter(self):
""" Обчислює периметр трикутника
:return: периметр трикутника
"""
# периметр це сума сторін трикутника
return self._a + self._b + self._c
def square(self):
""" Обчислює площу трикутника за формулою Герона
:return: площу трикутника
"""
p = self.perimeter() / 2.0 # обчислимо півпериметр
res = p * (p - self._a) * (p - self._b) * (p - self._c)
return res ** 0.5
```
----
```python=90
if __name__ == "__main__":
t = Triangle(3, 4, 5)
print(f"Площа заданого трикутника = {t.square():.6f}")
t2 = Triangle(t)
t2.c = 2
print(f"Площа трикутника зі сторонами {t2.a:.2f},",
f"{t2.b:.2f}, {t2.c:.2f} є {t2.square():.6f}")
```
```
Площа заданого трикутника = 6.0
Площа трикутника зі сторонами 3.0, 4.0, 2.0 є 2.904738
```
---
## 4. Статичні атрибути та методи
----
### Призначення
- Статичні атрибути та методи класу -- це спільні атрибути та методи для всіх екземплярів класу
- Якщо статичний атрибут змінити для одного екземпляру класу, то він зміниться для всіх інших також
----
### Статичні атрибути
```python=
class Car:
wheel_number = 4 # Статичний атрибут класу
print(Car.wheel_number) # Звернення до статичного атрибуту класу
c = Car()
print(c.wheel_number) # Звернення до статичного атрибуту класу
# через екземпляр класу
```
----
### Статичні методи
```python=
class Car:
wheel_number = 4 # Статичний атрибут класу
@staticmethod
def get_wheel_number():
""" Статичний метод
:return: значення статичного поля wheel_number
"""
return Car.wheel_number
# Виклик статичного методу через ім'я класу
print(Car.get_wheel_number())
# Виклик статичного методу через екземпляр класу
print(c.get_wheel_number())
```
----
### Приклад 5. Клас Triangle зі статичним методом
```python
class Triangle:
...
@staticmethod
def is_exist(a, b, c):
""" Перевіряє, чи можна створити
тикутник з заданими сторонами
"""
return a + b > c and a + c > b and c + b > a
...
# Перевірка чи існує трикутник зі сторонами 4, 5, 6
Triangle.is_exist(4, 5, 6) # через ім'я класу
t = Triangle(3, 4, 5)
# Перевірка чи існує трикутник зі сторонами 4, 5, 6
t.is_exist(4, 5, 6) # через екземпляр класу
```
---
### Зміст
1. [Процедурний та об’єктно-орієнтований стилі програмування](#/1)
2. [Поняття про класи та об’єкти](#/2)
3. [Інкапсуляція](#/3)
4. [Статичні атрибути та методи](#/4)
[](https://www.hneu.edu.ua/)
(c) [Яценко Р.М.](http://linkedin.com/in/yatsenkorm) ([ХНЕУ ім. С. Кузнеця](https://www.hneu.edu.ua/)), 2020-2025