Mediumnewinit

Что такое магические методы __new__ и __init__?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

`__new__(cls, ...)` — статический метод, создаёт экземпляр (выделяет память), возвращает instance. Вызывается до __init__. `__init__(self, ...)`инициализирует экземпляр после создания, не возвращает ничего.

# Singleton через __new__
class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

a = Singleton()
b = Singleton()
a is b   # True

# Полный цикл: Point(1, 2) → __new__ → __init__
class Point:
    def __new__(cls, x, y):
        print('new')
        return super().__new__(cls)
    def __init__(self, x, y):
        print('init')
        self.x, self.y = x, y
  • __new__ переопределяют для: singleton, immutable types (str, int, tuple — __init__ не вызывается), метаклассов;
  • Часто __init__ достаточно, __new__ для специальных случаев.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.