Конструктор класа
В ООП конструктором класа називають метод, який автоматично викликається при створенні об’єктів. Його також можна назвати конструктором об’єктів класа. Ім’я такого метода зазвичай регламентується синтаксисом конкретнї мови програмування. В Python роль конструктора виконує метод __init__().
Об’єкт створюється в момент виклику класа по імені, і в цей момент викликається метод init(), якщо його визначено в класі.
*Для “просунутих”:
В Python наявність пар знаків підкреслення попереду і позаду в імені метода говорить про те, що він належить до групи методів перевантаження операторів. Якщо подібні методи визначені у класі, то об’єкти можуть брати участь в таких операціях як додавання, віднімання, викликатись як функції та інше.
При цьому методи перевантаження операторів не треба викликати по імені. Викликом для них є сам факт участі об’єкта в певній операції. У випадку конструктора класа — це операція створення об’єкта.
*
Необхідність конструкторів пов’язана з тим, що часто об’єкти повинні мати власні властивості одразу. Припустимо маємо клас Person, об’єкти котрого обов’язково повинні мати ім’я. Якщо клас буде описано наступним способом:
:::python
class Person():
def set_name(self, name):
self.name = name
то створення об’єкта можливе без полів. Для встановлення імені метод set_name() неообхідно викликати окремо:
:::python
>>> p1 = Person()
>>> p1.name = 'Jane Doe'
>>> p1.name
'Jane Doe'
>>>
Наявність конструктора не дозволить створити об’єкт без полів:
:::python
class Person():
def __init__(self, name):
self.name = name
p1 = Person('Jane Doe')
print(p1.name)
Тут при виклику класа в круглих дужках передаються значення, котрі будуть присвоєні параметрам метода init(). Перший параметр – self – посилання на сам щойно створений об’єкт.
Тепер, якщо ми спробуємо створити об’єкт, не передавши нічого в конструктор, то буде “викинуто” вийняткову ситуацію, і об’єкт не буде створено:
:::python
>>> p2 = Person()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'name'
>>>
Однак буває, що необхідно допустити створення об’єкта, якщо деякі дані в конструктор не передаються. У такому випадку параметрам конструктора класа задаємо значення за замовчуванням:
:::python
class Person():
def __init__(self, name, phone=''):
self.name = name
self.phone = phone
Якщо викликати конструктор без параметра phone, то буде використано значення за замовчуванням. Однак поля name і phone будуть у всіх об’єктів:
:::python
>>> p1 = Person('Jane Doe', '+380971234567')
>>> p2 = Person('John Doe')
>>> p1.name, p1.phone
('Jane Doe', '+380971234567')
>>> p2.name, p2.phone
('John Doe', '')
>>>
Крім того, конструктору зовсім не обов’язковоо приймати будь-які параметри, крім self. Значення полям можуть назначатись як завгодно. Також не обов’язково, щооб в конструкторі виконувалось встановлення атрибутів об’єкта. Там може бути, наприклад, код, який створює об’єкти інших класів.
Деструктор класа
Окрім конструктора об’єктів в ООП є зворотній йому метод – деструктор. Він викликається, коли об’єкт знищується.
В Python об’єкт знищується, коли зникають усі пов’язані з ним змінні або їм присвоюється інше значення, в результаті чого зв’язок з старим об’єктом втрачається. Видалити змінну також можна за допомогою del.
В Python функцію деструктора виконує метод __del__().
Але в Python деструктор використовується рідко, інтерпретатор і без нього добре впорається зі “сміттям”.