Короткий ответ
Метод __init__() автоматически вызывается при создании объекта класса и инициализирует атрибуты экземпляра начальными значениями. Параметр self — ссылка на сам создаваемый экземпляр, через которую метод сохраняет данные и обращается к другим членам этого объекта.
Как это работает подробнее
Важно понимать, что __init__() не создаёт объект, а лишь настраивает уже выделенный экземпляр.
- Роль конструктора.
__init__()— аналог конструктора из других объектно-ориентированных языков: он срабатывает в момент создания экземпляра и задаёт начальное состояние. - Выделение памяти. Память под объект выделяет метод
__new__(), который вызывается раньше, а__init__()заполняет атрибуты уже готового экземпляра. - Назначение self. Первый параметр любого метода экземпляра — ссылка на конкретный объект; через присваивания вида
self.value = ...каждый экземпляр получает собственные данные. - Имя параметра. Название
self— лишь соглашение: важно, чтобы первым параметром передавался сам экземпляр, а имя может быть любым.
Пример кода
Инициализация атрибутов через __init__
class MyClass:
def __init__(self, value):
self.value = value # сохраняем значение в атрибут объекта
def display(self):
print(f'Value: {self.value}')
obj = MyClass(10)
obj.display() # Value: 10Что использовать на практике
- Инициализация. Все начальные значения атрибутов задавай в
__init__(), а не присваиванием снаружи. - Значения по умолчанию. Если атрибут не всегда нужен, предусматривай значение по умолчанию в сигнатуре конструктора.
- Состояние объекта. Храни данные в атрибутах через
self, чтобы методы могли их читать и изменять.
Подводные камни
- Забытый self. Без
selfпервым параметром метод не получит экземпляр, и вызов закончится ошибкой о несовпадении числа аргументов. - Возврат значения.
__init__()должен возвращатьNone: иной результат вызовет исключение TypeError. - Путаница с __new__. Считая
__init__()создателем объекта, легко забыть, что память выделяет__new__(), что важно при работе с неизменяемыми типами.
Как отвечать на собеседовании
- Начни с определения
__init__()как метода инициализации, который срабатывает при создании экземпляра → объясни рольselfкак ссылки на объект и обязательность первого параметра → приведи короткий пример класса → упомяни, что память выделяет__new__(), а не__init__().