Чем __init__() отличается от __new__()?

Этот вопрос проверяет понимание двух ключевых методов в Python, которые участвуют в создании и инициализации объектов.

Короткий ответ

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

Длинный ответ

__new__() и __init__() играют разные роли:

- __new__() создаёт объект, вызывается перед __init__(). Это метод класса (статический метод). Он особенно полезен для наследования от неизменяемых типов, таких как числа или строки.

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

 

Пример:

class MyClass:
    def __new__(cls, *args, **kwargs):
        print("Создание объекта")
        return super().__new__(cls)

    def __init__(self, value):
        print("Инициализация объекта")
        self.value = value

obj = MyClass(42)
# Вывод:
# Создание объекта
# Инициализация объекта

 

Если вы возвращаете None или другой объект из __new__(), __init__() не будет вызван.

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

class MyInt(int):
    def __new__(cls, value):
        return super().__new__(cls, value + 1)

num = MyInt(5)
print(num)  # 6

Уровень

  • Рейтинг:

    2

  • Сложность:

    5

Навыки

  • Python

Ключевые слова

Подпишись на Python Developer в телеграм