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

Какой вызывается метод при создании класса?

1.7 Middle🔥 111 комментариев
#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

new() и init() — методы создания класса

При создании экземпляра класса в Python вызываются два специальных метода в определённом порядке: new() и init(). Это ключевая часть жизненного цикла объекта.

Порядок создания объекта

  1. new() — создаёт новый экземпляр класса (низкоуровневое создание)
  2. init() — инициализирует созданный экземпляр (установка атрибутов)
class MyClass:
    def __new__(cls, value):
        print(f'__new__() вызывается для {cls.__name__}')
        instance = super().__new__(cls)  # Создаём объект
        return instance
    
    def __init__(self, value):
        print(f'__init__() вызывается с value={value}')
        self.value = value

obj = MyClass(42)
# Вывод:
# __new__() вызывается для MyClass
# __init__() вызывается с value=42

new() — создание объекта

new() — это статический метод, который создаёт новый экземпляр класса. Он должен вернуть экземпляр класса:

class Singleton:
    _instance = None
    
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance
    
    def __init__(self, value):
        self.value = value

obj1 = Singleton(1)
obj2 = Singleton(2)

print(obj1 is obj2)  # True — один и тот же объект
print(obj1.value)    # 2 — инициализирован последний раз

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

init() — это обычный метод, который инициализирует уже созданный объект. Он не возвращает ничего (или возвращает None):

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print(f'Person инициализирован: {self.name}')

person = Person('Alice', 30)
# Вывод: Person инициализирован: Alice

Различия между new() и init()

Аспектnew()init()
Тип методаСтатическийОбычный
Параметр первыйcls (класс)self (экземпляр)
ЦельСоздание объектаИнициализация объекта
Возвращаемое значениеЭкземпляр классаNone
Когда используетсяКонтроль созданияУстановка атрибутов

Практические примеры

Пример 1: Контроль типа результата

class SmartInt(int):
    def __new__(cls, value):
        # Преобразуем строку в число
        if isinstance(value, str):
            value = int(value)
        return super().__new__(cls, value)

obj = SmartInt('42')
print(obj)  # 42
print(type(obj))  # <class '__main__.SmartInt'>

Пример 2: Кэширование объектов

class CachedClass:
    _cache = {}
    
    def __new__(cls, key):
        if key not in cls._cache:
            instance = super().__new__(cls)
            cls._cache[key] = instance
        return cls._cache[key]
    
    def __init__(self, key):
        self.key = key

obj1 = CachedClass('key1')
obj2 = CachedClass('key1')
print(obj1 is obj2)  # True

Пример 3: Наследование и мета-классы

class Parent:
    def __new__(cls, *args, **kwargs):
        print(f'Parent.__new__() для {cls.__name__}')
        return super().__new__(cls)
    
    def __init__(self):
        print(f'Parent.__init__()')

class Child(Parent):
    def __init__(self):
        super().__init__()
        print(f'Child.__init__()')

obj = Child()
# Вывод:
# Parent.__new__() для Child
# Parent.__init__()
# Child.__init__()

Ключевые моменты

  • new() вызывается первым и создаёт новый объект
  • init() вызывается вторым и инициализирует объект
  • new() используется редко, в основном для контроля создания объектов
  • init() — это стандартный способ инициализации атрибутов
  • В наследовании порядок сохраняется: new() родителя → init() родителя → init() потомка