Чем отличается метод __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__ вернул экземпляр соответствующего класса) |
Настройка созданного экземпляра, присвоение значений атрибутам |