Какую роль выполняет метод __new__ в Python и чем он отличается от __init__

Ответ

Метод __new__ — это специальный статический метод в Python, который отвечает за создание экземпляра класса. Он вызывается до метода __init__, который отвечает за инициализацию уже созданного экземпляра.

Ключевые различия

Характеристика __new__(cls, ...) __init__(self, ...)
Назначение Создание экземпляра Инициализация экземпляра
Первый аргумент Класс (cls) Экземпляр (self)
Возвращаемое значение Должен вернуть новый экземпляр Ничего не возвращает (None)
Тип метода Статический метод (неявно) Метод экземпляра

Практический пример: Singleton

Основное применение __new__ — управление процессом создания объекта. Классический пример — реализация паттерна Singleton, который гарантирует, что у класса есть только один экземпляр.

class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        # Если экземпляр еще не создан
        if not cls._instance:
            # Создаем его с помощью родительского __new__
            cls._instance = super().__new__(cls)
        # Возвращаем существующий или только что созданный экземпляр
        return cls._instance

    def __init__(self):
        print("Вызван __init__")

a = Singleton()
b = Singleton()

print(f"a is b: {a is b}") # Output: a is b: True

В этом примере __new__ гарантирует, что super().__new__(cls) будет вызван только один раз. Метод __init__ будет вызываться при каждой попытке создания объекта, но сам объект всегда будет один и тот же.