Ответ
Метод __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__ будет вызываться при каждой попытке создания объекта, но сам объект всегда будет один и тот же.