Чем __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