54 views
--- 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. Процедурний та об'єктно-орієнтований стилі програмування ---- ### Процедурний стиль програмування - був домінуючим підходом під час розробки програмного забезпечення протягом десятиліть - добре працює для окремих типів проектів (наприклад, для задач обчислювальної математики) - не підходить для складних проектів, результати роботи яких оточують нас у сучасному комп’ютерному світі ---- ### Недоліки - Алгоритми і структури даних - функції, що об'єднуються в модулі - змінні різних типів даних - Незахищеність даних - потрібно контролювати правильний зв'язок дані-функції ---- ### Об’єктно-орієнтований підхід - Дані і код об’єднуються разом у єдину структуру – *об’єкт* - Дозволяє описати сутності реального світу у вигляді об’єктів, а також організувати зв’язки між ними - Правильно побудований об’єкт здатен захистити свої дані від несанкціонованого використання чи модифікації ---- Об'єктно-орієнтоване програмування (ООП) : це парадигма програмування, яка розглядає програму як множину "об'єктів", що взаємодіють між собою *Основна мета ООП* -- забезпечити повторне виконання існуючого програмного коду та спростити програмування піднявши його на новий рівень абстракції ---- ![](https://content.hneu.edu.ua/uploads/upload_be078245230cebdbed54a18f0fa1ef07.png) --- ## 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. Інкапсуляція ---- Інкапсуляція : механізм, що полягає у приховуванні від зовнішнього користувача (прикладного програміста, іншого об'єкта тощо) деталей реалізації об'єкта, натомість надаючи механізм взаємодії з об'єктом - Інкапсуляція -- це механізм об’єднання коду і даних всередині об’єкта, а також їхній захист від непередбачених змін ззовні - Вона слугує передусім для того, щоб не давати можливості змінювати внутрішній стан об'єкта без його відома ---- Інтерфейс класу : це набір загальнодоступних полів та методів класу ![](https://content.hneu.edu.ua/uploads/upload_7c06d0c0b64ffc68ab92a96f1f8713b3.png) ---- ### Приватний та публічний методи ```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 з&nbsp;властивостями ```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 зі&nbsp;статичним методом ```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://content.hneu.edu.ua/uploads/upload_3be98e252d6967a3ac9f19e1472dc2fb.png)](https://www.hneu.edu.ua/) (c) [Яценко Р.М.](http://linkedin.com/in/yatsenkorm) ([ХНЕУ ім. С. Кузнеця](https://www.hneu.edu.ua/)), 2020-2025