Получить доступ

Чем __new__ отличается от __init__?

MiddleООП
Ещё спрашивают так:
  • Когда переопределяют __new__?
Коротко

__new__ — статический метод, создаёт и возвращает экземпляр (вызывается первым). __init__ — инициализирует уже созданный объект и ничего не возвращает. __new__ переопределяют редко: подклассы неизменяемых типов (int, str, tuple), синглтоны и кэши экземпляров, метаклассы.

  • Если __new__ вернул объект не своего класса, __init__ не вызывается
  • Неизменяемый объект нельзя изменить в __init__ — значение задаётся в __new__
  • Вызов: cls.__new__(cls, ...), затем obj.__init__(...)

А ещё Для синглтона проще модуль или функция с lru_cache

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

**Последовательность Cls(args):** метакласс вызывает Cls.__new__(Cls, *args) — он выделяет объект (обычно через super().__new__(cls)) и возвращает его; если результат — экземпляр Cls, вызывается obj.__init__(*args).

Зачем __new__:

  • неизменяемые типы — значение int, str, tuple задаётся при создании; в __init__ его уже не поменять;
  • контроль создания — вернуть существующий экземпляр (кэш, синглтон), объект подкласса (фабрика);
  • метаклассы — __new__ метакласса создаёт класс.

Ловушка синглтона через __new__: даже если __new__ возвращает тот же объект, __init__ вызывается при каждом Cls() и сбрасывает состояние. Для синглтона в Python обычно достаточно модуля — он импортируется один раз.

Пример

class Celsius(float):
    def __new__(cls, value):
        if value < -273.15:
            raise ValueError("ниже абсолютного нуля")
        return super().__new__(cls, value)

t = Celsius(21.5)   # __init__ float тут не помог бы: значение уже задано

Что хотят услышать

  • Создание против инициализации.
  • Когда нужен __new__.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем