Про жизненный цикл инстанса.
▪️
__init__object.__init__(self[, ...])Думаю, как конструктор используется очень часто. В основном это инициализация экземпляра (например, инициализация атрибутов). Отличие от
__new__, о котором ниже: __init__ выполняется уже после создания экземпляра.Возвращаемое значение всегда
None.▪️
__new__object.__new__(cls[, ...])В отличие от
__init__, выполняется до создания экземпляра и отвечает именно за его создание. Поэтому это не инстанс-метод, а статический метод, но явно прописывать @staticmethod не нужно.Возвращаемое значение должно быть созданным экземпляром (обычно это экземпляр класса из аргумента
cls).Типичное место применения
__new__ это инициализация подклассов, которые наследуются от иммутабельных типов (int, str, tuple и т.д.). Они иммутабельные, поэтому после создания объекта нельзя менять атрибуты через __init__.Ещё
__new__ используют для реализации паттерна Singleton.▪️
__del__object.__del__(self)Вызывается в момент, когда экземпляр уничтожается (например, через
del). Явных популярных кейсов немного, но может быть полезно при отладке, чтобы понимать тайминг работы GC.👉 @PythonPortal