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