В какой последовательности в Python вызываются методы __new__ и __init__ при создании объекта?

Ответ

При создании экземпляра класса в Python сначала вызывается статический метод __new__, а затем — метод экземпляра __init__.

  1. __new__(cls, ...)

    • Отвечает за создание и возврат экземпляра класса. Это первый шаг в жизненном цикле объекта.
    • Является статическим методом (первый аргумент — сам класс cls).
    • Должен вернуть экземпляр класса (или его подкласса), иначе __init__ не будет вызван.
    • Используется редко, в основном для реализации паттернов (например, Singleton) или для кастомизации создания неизменяемых (immutable) типов.
  2. __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