В чём init() отличается от new()? new — создаёт экземпляр класса и вызывается первым init — инициализирует уже созданный объект new — статический метод, который возвращает новый экземпляр init — обычный метод, задающий значения атрибутов new преимущественно применяют при наследовании immutable типов Без new экземпляр не будет создан, а без init он останется пустым init обычно переопределяют, чтобы задать логику и начальные параметры объекта
В чём разница между __init__() и __new__() в Python?
В чём init() отличается от new()? new — создаёт экземпляр класса и вызывается первым init — инициализирует уже созданный объект new — статический метод, который возвращает новый экземпляр 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__(), чтобы корректно унаследовать логику и создать экземпляр.