Что делает метод new

Основное различие между этими двумя методами состоит в том, что __new__ обрабатывает создание объекта, а __init__ обрабатывает его инициализацию.

__new__ вызывается автоматически при вызове имени класса (при создании экземпляра), тогда как __init__ вызывается каждый раз, когда экземпляр класса возвращается __new__, передавая возвращаемый экземпляр в __init__ в качестве параметра self, поэтому даже если вы сохранили экземпляр где-нибудь глобально/статически и возвращали его каждый раз из __new__, для него все-равно будет каждый раз вызываться __init__.

Из вышесказанного вытекает что сначала вызывается __new__, а потом __init__

Oct. 9, 2023, Источник

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

В отличие от метода `__init__()`, который инициализирует уже созданный объект, данный метод создает новый объект. Обычно вы переопределяете этот метод только в специальных случаях, когда вам нужно настроить способ создания объекта или выполнить какую-то предварительную обработку до его инициализации.

Основное использование метода включает в себя:

1. Переопределение метода `__new__()` для настройки поведения создания объекта, например, для создания объекта определенного подкласса в зависимости от некоторого условия.
2. Вызов данного метода в метаклассах для создания нового экземпляра класса при определении класса.

Пример:

class MyClass:
    def __new__(cls, *args, **kwargs):
        # Создание нового экземпляра класса
        instance = super().__new__(cls)
        # Некоторая предварительная обработка перед инициализацией
        print("Создан новый объект")
        return instance

    def __init__(self, x):
        self.x = x

obj = MyClass(10)

В этом примере метод `__new__()` создает новый объект класса `MyClass`, а затем вызывается метод `__init__()` для его инициализации.

Feb. 18, 2024, easyoffer