Конструктор класа

В ООП конструктором класа називають метод, який автоматично викликається при створенні об’єктів. Його також можна назвати конструктором об’єктів класа. Ім’я такого метода зазвичай регламентується синтаксисом конкретнї мови програмування. В 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 деструктор використовується рідко, інтерпретатор і без нього добре впорається зі “сміттям”.