← Назад ко всем вопросам

Чем init() отличается от new()?

1️⃣ Как кратко ответить

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

2️⃣ Подробное объяснение темы

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

__new__() — Создание объекта

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

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

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

__init__() — Инициализация объекта

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

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

class MyClass:
    def __init__(self, value):
        # Инициализация экземпляра
        self.value = value
        print("Инициализация экземпляра")
​
# Создание объекта
obj = MyClass(10)
  • def __init__(self, value): — определение метода __init__(), который принимает экземпляр self и аргумент value.
  • self.value = value — установка начального состояния экземпляра.

Зачем и где это применяется

  • __new__() используется редко, в основном при создании классов, наследующих от неизменяемых типов, таких как int, str, tuple. Это позволяет контролировать процесс создания экземпляра.
  • __init__() используется для инициализации объектов, устанавливая их начальное состояние. Это стандартный метод, который используется в большинстве классов.

Как это работает

Когда вы создаете объект класса, Python сначала вызывает __new__(), чтобы создать новый экземпляр. Затем, если __new__() возвращает экземпляр класса, вызывается __init__(), чтобы инициализировать этот экземпляр. Это позволяет разделить процесс создания и инициализации объекта, что может быть полезно в сложных сценариях, таких как наследование и работа с неизменяемыми типами.

Тема: Python
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки