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

На каком этапе происходит инициализация класса в 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 = []

Порядок вызова методов

  1. new(cls, ...) — создаёт объект в памяти
  2. init(self, ...) — инициализирует атрибуты объекта
  3. Возврат объекта — объект передаётся в переменную

Разница между new и init

Аспектnewinit
ОтветственностьСоздание объектаИнициализация данных
Тип методаСтатическийОбычный экземпляра
Параметрclsself
ВозвращаетНовый объект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 и другие.

На каком этапе происходит инициализация класса в Python? | PrepBro