Sobes.tech
Назад к вопросам
Junior — Middle
61

Что происходит сначала: выполнение конструктора при создании объекта или вызов метода init?

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

sobes.tech AI

Что хотят услышать интервьюеры:

Сначала создаётся сам объект, а затем вызывается __init__ для его инициализации. Конструктором в Python обычно называют __new__, который выделяет и создаёт объект, а __init__ лишь настраивает уже созданный экземпляр. Поэтому при обычном создании через ClassName() сначала происходит создание, потом инициализация.

Определение:

В Python процесс создания объекта состоит из двух этапов: __new__ создаёт экземпляр и возвращает его, а __init__ заполняет его начальными значениями. Если говорить простыми словами, __new__ отвечает за появление объекта, а __init__ — за его настройку. При этом в повседневной разработке чаще всего переопределяют именно __init__, а __new__ трогают редко.

Пример использования:

class User:
    def __new__(cls, *args, **kwargs):
        print("1. __new__")
        return super().__new__(cls)

    def __init__(self, name):
        print("2. __init__")
        self.name = name


u = User("Alice")
print(u.name)

Пояснение кода:

Код показывает порядок вызовов при создании объекта.

  1. Сначала вызывается __new__, он создаёт новый экземпляр класса и возвращает его.
  2. Затем вызывается __init__, который получает уже созданный объект и инициализирует его полями.
  3. После этого переменная u ссылается на готовый объект, у которого доступен атрибут name.

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

  • В Python сначала создаётся объект, потом вызывается __init__.
  • __new__ — это этап создания объекта, __init__ — этап его инициализации.
  • Обычно при ответе на собеседовании важно сказать, что __init__ не создаёт объект, а только настраивает его.
  • Если __new__ не вернёт экземпляр класса, __init__ не будет вызван.
  • В обычном коде чаще переопределяют __init__, а __new__ используют для иммутабельных типов и специальных сценариев.