В чём разница между __init__() и __new__() в Python?

В чём init() отличается от new()? new — создаёт экземпляр класса и вызывается первым init — инициализирует уже созданный объект new — статический метод, который возвращает новый экземпляр init — обычный метод,…

Короткий ответ

Что ответить на собеседовании

В чём init() отличается от new()? new — создаёт экземпляр класса и вызывается первым init — инициализирует уже созданный объект new — статический метод, который возвращает новый экземпляр init — обычный метод, задающий значения атрибутов new преимущественно применяют при наследовании immutable типов Без new экземпляр не будет создан, а без init он останется пустым init обычно переопределяют, чтобы задать логику и начальные параметры объекта

Подробный разбор

Ответ с пояснениями

В чём init() отличается от new()?

  • newсоздаёт экземпляр класса и вызывается первым
  • initинициализирует уже созданный объект
  • new — статический метод, который возвращает новый экземпляр
  • init — обычный метод, задающий значения атрибутов
  • new преимущественно применяют при наследовании immutable типов
  • Без new экземпляр не будет создан, а без init он останется пустым
  • init обычно переопределяют, чтобы задать логику и начальные параметры объекта

Итог: new создаёт объект, а init отвечает за его настройку.

Подробный ответ

Основной ответ

За создание нового экземпляра класса, включая выделение памяти и возврат объекта, отвечает метод __new__(). Метод __init__() запускается уже после создания экземпляра и занимается его инициализацией: задаёт начальное состояние и заполняет атрибуты. Иными словами, __new__() создаёт объект, а __init__() приводит его в нужное состояние.

Ключевые моменты

  • __new__() — статический метод, первым аргументом получает класс и обязан вернуть экземпляр этого класса либо его производного. Переопределяют его редко: главным образом при работе с неизменяемыми типами, такими как tuple и str, а также когда требуется управлять самим созданием объекта.
  • __init__() — метод экземпляра. Он вызывается сразу после __new__() для конкретного объекта и настраивает его внутреннее состояние, например присваивает значения атрибутам.
  • Когда __new__() возвращает объект, не относящийся к текущему классу, вызов __init__() не происходит. Это особенно важно помнить при наследовании и использовании паттернов проектирования.

Практический контекст

Для обычных пользовательских классов Python, как правило, достаточно определить только __init__(). Переопределённый __new__() чаще встречается в библиотеках и расширенных сценариях — например, при реализации паттерна Singleton или создании объектов с изменённым поведением на уровне памяти. В Python 3.7+ обычно __new__() вызывает super().__new__(), чтобы корректно унаследовать логику и создать экземпляр.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку