Ініціалізація екземплярів класа
Часто об'єкти повинні мати власні атрибути-дані одразу після створення.
Припустимо маємо клас 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
.