Зачем нужен __new__ в Python
Когда вы создаете экземпляр класса, Python сначала вызывает метод __new() для создания объекта, а затем вызывает метод init() __для инициализации атрибутов объекта.
__new() — это статический метод класса объекта. Он имеет следующую сигнатуру:
object.new(class, *args, **kwargs)__
Первый аргумент метода __new — это класс нового объекта, который вы хотите создать. Параметры *args и **kwargs должны совпадать с параметрами init() класса. Метод new()__ также их использует.
Чтобы создать объект класса, нужно вызывать метод super().new().
Практическое применение __new __
Как правило, __init() используется для инициализации вновь созданного объекта, а new() для управления способом создания объекта. Мы также можем использовать new() для инициализации атрибутов объекта, но по логике это должно быть внутри init()__.
Однако одним из частых практических применений __new()__ является ограничение количества объектов, созданных из класса.
Примеры частных случаев использования __new __
- Создание одноэлементного шаблона (хотя это не единственный способ).
- Динамическое расширение классов из внешних модулей без фактического редактирования исходного кода.
- Настройка классов в метаклассе (аналогично использованию call)
- Расширение неизменяемого класса datetime.datetime. Это нужно, чтобы вернуть текущее время, если он создается без аргументов, и результат вызова strptime для аргумента, если он вызывается с одним строковым аргументом.