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

На каком этапе выполнения интерпретатор Python создает объект конструктора — до компиляции исходного кода или во время его выполнения?

Компании, где спрашивали
ООО Цитадель

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

sobes.tech AI

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

Объекты функций в Python создаются не при «компиляции» исходника, а во время выполнения модуля, когда интерпретатор доходит до def или class. Сначала код преобразуется в байткод, а затем при исполнении инструкции создания функции/класса формируется соответствующий объект. Важно различать саму функцию/конструктор как объект и вызов этого объекта.

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

В Python исходный код сначала компилируется в байткод, но объекты функций, методов и классов создаются в момент выполнения соответствующих операторов. То есть def и class не «заранее» создают объект на этапе компиляции, а выполняются как обычные инструкции при запуске модуля. Для конструктора это особенно заметно: сам объект функции __init__ появляется при выполнении тела class, а экземпляр класса создается только при вызове класса.

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

print("до определения")

def foo():
    return "hello"

print("после определения")

class A:
    def __init__(self):
        print("создан экземпляр")

print(foo)
obj = A()

Здесь объект функции foo создается в момент, когда интерпретатор доходит до def foo(), а не раньше. Объект класса A создается при выполнении class A: ..., а объект-экземпляр — только при вызове A().

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

Код нужен, чтобы увидеть порядок выполнения:

  1. Сначала выполняется print("до определения").
  2. Затем интерпретатор доходит до def foo(): и создает объект функции foo.
  3. Далее выполняется print("после определения").
  4. Когда выполняется class A:, создается объект класса A, а внутри него — объект функции __init__.
  5. При вызове A() уже создается экземпляр класса, и вызывается его __init__.

Итог: компиляция готовит код к выполнению, но сами объекты функций/классов появляются во время выполнения соответствующих инструкций.

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

  • Исходник Python сначала компилируется в байткод, но объекты создаются при выполнении.
  • def создает объект функции в runtime, когда интерпретатор выполняет эту строку.
  • class тоже выполняется как инструкция и создает объект класса в runtime.
  • Экземпляр класса создается только при вызове класса, например A().
  • Конструктор в бытовом смысле часто путают с классом: объект функции __init__ создается при выполнении class, а не при вызове экземпляра.