Выбор ответа Senior ООП и dataclasses обновлено

Что вызывается при создании экземпляра

Вопрос

Что на самом деле происходит при выполнении obj = MyClass(1)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: type(MyClass).call вызывает new, затем init. Класс это объект, и вызов MyClass(1) обращается к call его метакласса (по умолчанию type.call).

Варианты ответа

  1. Вызывается только MyClass.__init__, объект создаёт интерпретатор
  2. type(MyClass).__call__ вызывает __new__, затем __init__правильный ответ
  3. Вызывается MyClass.__call__, определённый в самом классе
  4. Сначала __init__ заполняет поля, затем __new__ создаёт объект

Разбор

Класс это объект, и вызов MyClass(1) обращается к __call__ его метакласса (по умолчанию type.__call__). Он вызывает __new__ для создания объекта и __init__ для настройки, причём __init__ пропускается, если __new__ вернул объект другого класса. MyClass.__call__ срабатывает при вызове экземпляра, а не класса. Переопределив __call__ в метаклассе, можно, например, сделать синглтон.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме