Что происходит сначала: выполнение конструктора при создании объекта или вызов метода 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)
Пояснение кода:
Код показывает порядок вызовов при создании объекта.
- Сначала вызывается
__new__, он создаёт новый экземпляр класса и возвращает его. - Затем вызывается
__init__, который получает уже созданный объект и инициализирует его полями. - После этого переменная
uссылается на готовый объект, у которого доступен атрибутname.
Ключевые моменты:
- В Python сначала создаётся объект, потом вызывается
__init__. __new__— это этап создания объекта,__init__— этап его инициализации.- Обычно при ответе на собеседовании важно сказать, что
__init__не создаёт объект, а только настраивает его. - Если
__new__не вернёт экземпляр класса,__init__не будет вызван. - В обычном коде чаще переопределяют
__init__, а__new__используют для иммутабельных типов и специальных сценариев.