Назад к вопросам
Middle
104
questionbank

Чем отличается метод __init__ от метода __new__ в Python?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

__new__ — статический метод (неявно получает первым аргументом класс cls, а не экземпляр self), отвечающий за создание экземпляра объекта. Он вызывается до __init__. Если __new__ возвращает экземпляр класса, на котором он был вызван (или его подкласса), то затем вызывается метод __init__ для инициализации этого экземпляра. Если __new__ возвращает экземпляр другого класса, __init__ не вызывается.

__init__ — метод экземпляра (получает первым аргументом экземпляр self), отвечающий за инициализацию (настройку) уже созданного экземпляра объекта.

Использование __new__ обычно требуется в следующих случаях:

  • Изменение поведения при создании экземпляров неизменяемых типов (строки, числа, кортежи).
  • Реализация паттернов, таких как Singleton.
  • Наследование от неизменяемых встроенных типов.

Пример использования __new__ для реализации Singleton:

class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__new__(cls) # Вызов __new__ базового класса для создания экземпляра
        return cls._instance

    def __init__(self, value):
        # __init__ будет вызван каждый раз, если __new__ возвращает тот же экземпляр
        self.value = value

# Создание экземпляров
s1 = Singleton(1)
s2 = Singleton(2)

# Проверка, что это один и тот же экземпляр
# print(s1 is s2) # Вывод: True
# print(s1.value) # Вывод: 2
# print(s2.value) # Вывод: 2

Пример использования __init__:

class MyClass:
    def __init__(self, name):
        self.name = name # Инициализация атрибута экземпляра

    def greet(self):
        return f"Hello, {self.name}!"

# Создание экземпляра и вызов метода
# obj = MyClass("World")
# print(obj.greet()) # Вывод: Hello, World!

Сравнение:

Метод Назначение Тип метода Первый аргумент Когда вызывается Типичные случаи использования
__new__ Создание экземпляра Статический cls (класс) До __init__ Переопределение создания экземпляров неизменяемых типов, Singleton, наследование от встроенных неизменяемых типов
__init__ Инициализация экземпляра Экземпляра self (экземпляр) После __new__ (если __new__ вернул экземпляр соответствующего класса) Настройка созданного экземпляра, присвоение значений атрибутам