← Назад к вопросам
Какой вызывается метод при создании класса?
1.7 Middle🔥 111 комментариев
#REST API и HTTP
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
new() и init() — методы создания класса
При создании экземпляра класса в Python вызываются два специальных метода в определённом порядке: new() и init(). Это ключевая часть жизненного цикла объекта.
Порядок создания объекта
- new() — создаёт новый экземпляр класса (низкоуровневое создание)
- 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() потомка