Перейти до змісту

Ініціалізація екземплярів класа

Часто об'єкти повинні мати власні атрибути-дані одразу після створення. Припустимо маємо клас Person, екземпляри котрого обов'язково повинні мати атрибут "ім'я людини". Якщо клас буде описано наступним способом:

class Person:
    pass

то після створення кожного екземпляра необхідно створити відповідний атрибут:

>>> p1 = Person()
>>> p1.name = 'Даринка'
>>> p1.name
'Даринка'
>>> p2 = Person()
>>> p2.name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute 'name'
>>>

Ми можемо визначити ініціалізатор для класа.

class Person():
    def __init__(self, name):
        self.name = name

Усе, що буде вказано при створенні екземпляра, буде передано ініціалізатору.

>>> p1 = Person('Даринка')
>>> p1.name
'Даринка'
>>>

Тут при виклику класа в круглих дужках передаються значення, котрі будуть присвоєні параметрам метода __init__(). Зауважте: перший параметр – self – посилання на сам щойно створений екземпляр.

Наявність ініціалізатора класа не дозволить створити екземпляр без полів: Якщо ми спробуємо створити екземпляр класа не передавши нічого в ініціалізатор, то буде "викинуто" вийняток, і екземпляр не буде створено:

>>> p2 = Person()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'name'
>>>

Однак буває, що необхідно допустити створення екземпляра без вказання певних даних. У такому випадку відповідним параметрам ініціалізатора класа задаємо значення за замовчуванням:

class Person():
    def __init__(self, name, phone=''):
        self.name = name
        self.phone = phone

При створенні екземпляра без зазначення параметра phone буде використано значення за замовчуванням. Однак поля name і phone будуть у всіх об'єктів:

>>> p1 = Person('Даринка', '322-223')
>>> p2 = Person('Ярик')
>>> p1.name, p1.phone
('Даринка', '322-223')
>>> p2.name, p2.phone
('Ярик', '')
>>>

Крім того, ініціалізатору зовсім не обов'язковоо приймати будь-які параметри, крім self. Значення полям можуть назначатись як завгодно. Також не обов'язково, щооб в конструкторі виконувалось встановлення атрибутів об'єкта. Там може бути будь-який код, наприклад, код, який створює об'єкти інших класів:

class News2Telegram:
    def __init__(self):
        self.parser = NewsParser()
        self.bot = TelegramBot()

Ініціалізатор завжди має повертати None.

Back to top