← Назад к вопросам
На каком этапе происходит инициализация класса в Python?
1.0 Junior🔥 181 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Инициализация класса в Python
Инициализация класса — это критически важный процесс, который происходит в несколько этапов. Разберёмся, как именно Python создаёт объект и подготавливает его к использованию.
Этап 1: Создание экземпляра (new)
На первом этапе вызывается специальный метод new(), который отвечает за создание самого объекта. Это статический метод, который получает класс в качестве первого аргумента:
class MyClass:
def __new__(cls, value):
print(f"__new__ вызван для класса {cls.__name__}")
instance = super().__new__(cls)
return instance
def __init__(self, value):
print(f"__init__ вызван для объекта {self}")
self.value = value
obj = MyClass(42)
__new__() возвращает **новый экземпляр класса**. Если метод вернёт None или объект другого класса, __init__() не будет вызван.
Этап 2: Инициализация экземпляра (init)
После успешного создания объекта вызывается метод init(), который инициализирует атрибуты объекта:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
self.email = None
person = Person("Иван", 30)
print(person.name) # Иван
print(person.age) # 30
__init__() — это обычный метод экземпляра (не статический), первый параметр — сам объект (self).
Полный процесс с примерами
Пример 1: Контроль над созданием объекта
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self):
self.created_at = None
obj1 = Singleton()
obj2 = Singleton()
print(obj1 is obj2) # True
Пример 2: Валидация параметров
class BankAccount:
def __new__(cls, balance):
if balance < 0:
raise ValueError("Баланс не может быть отрицательным")
return super().__new__(cls)
def __init__(self, balance):
self.balance = balance
self.transactions = []
Порядок вызова методов
- new(cls, ...) — создаёт объект в памяти
- init(self, ...) — инициализирует атрибуты объекта
- Возврат объекта — объект передаётся в переменную
Разница между new и init
| Аспект | new | init |
|---|---|---|
| Ответственность | Создание объекта | Инициализация данных |
| Тип метода | Статический | Обычный экземпляра |
| Параметр | cls | self |
| Возвращает | Новый объект | Nothing (None) |
| Когда вызывается | До init | После new |
| Используется | Редко | Часто |
Практический пример: Класс с полной инициализацией
from datetime import datetime
class Document:
_id_counter = 0
def __new__(cls, title, content):
instance = super().__new__(cls)
instance.id = cls._id_counter
cls._id_counter += 1
return instance
def __init__(self, title, content):
self.title = title
self.content = content
self.created_at = datetime.now()
def __repr__(self):
return f"Document(id={self.id}, title={self.title})"
doc1 = Document("Введение", "Начало статьи")
doc2 = Document("Заключение", "Конец статьи")
print(doc1.id) # 0
print(doc2.id) # 1
Ключевые моменты
- new() вызывается раньше, чем init()
- new() нужен для контроля над созданием объекта (Singleton, пулинг объектов)
- init() нужен для инициализации атрибутов
- Если new() вернёт None или объект другого класса — init() не выполнится
- В 99% случаев достаточно только init(), без переопределения new()
Текущий процесс инициализации позволяет Python обеспечить гибкость при создании объектов и поддерживает такие паттерны, как Singleton, Factory и другие.