Ответ
При создании экземпляра класса в Python сначала вызывается статический метод __new__, а затем — метод экземпляра __init__.
-
__new__(cls, ...)- Отвечает за создание и возврат экземпляра класса. Это первый шаг в жизненном цикле объекта.
- Является статическим методом (первый аргумент — сам класс
cls). - Должен вернуть экземпляр класса (или его подкласса), иначе
__init__не будет вызван. - Используется редко, в основном для реализации паттернов (например, Singleton) или для кастомизации создания неизменяемых (immutable) типов.
-
__init__(self, ...)- Отвечает за инициализацию уже созданного экземпляра. Его задача — установить начальные атрибуты объекта.
- Является обычным методом экземпляра (первый аргумент —
self, ссылка на созданный экземпляр). - Ничего не возвращает (точнее, неявно возвращает
None).
Пример последовательности вызовов:
class MyClass:
def __new__(cls, *args, **kwargs):
print(f"1. Вызов __new__ для класса {cls.__name__}")
# Создаем экземпляр с помощью __new__ родительского класса
instance = super().__new__(cls)
print(" Экземпляр создан")
return instance
def __init__(self, value):
print(f"2. Вызов __init__ для экземпляра {id(self)}")
self.value = value
print(" Экземпляр инициализирован")
# При создании объекта вызываются оба метода
obj = MyClass(42)
print(f"nСоздан объект: {obj.value}")
Вывод:
1. Вызов __new__ для класса MyClass
Экземпляр создан
2. Вызов __init__ для экземпляра 140343833620240
Экземпляр инициализирован
Создан объект: 42