Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: dataclass, frozen, immutable, __setattr__, python

Как изнутри реализован запрет изменений в frozen-датаклассе?

Вопрос проверяет понимание внутреннего механизма заморозки датаклассов в Python и того, как именно реализуется запрет на изменение полей.

Короткий ответ

Запрет изменений в frozen-датаклассе реализуется через переопределение метода __setattr__. При создании экземпляра с frozen=True, Python генерирует класс, который при попытке присвоить значение атрибуту вызывает исключение FrozenInstanceError. Это достигается тем, что после инициализации объекта метод __setattr__ блокирует любые изменения, кроме тех, что происходят внутри __init__.

Длинный ответ

Как работает frozen в датаклассах

Когда вы создаете датакласс с параметром frozen=True, Python генерирует специальный класс, который предотвращает изменение атрибутов после инициализации. Это достигается за счет переопределения метода __setattr__.

Механизм реализации

При использовании декоратора @dataclass(frozen=True), Python автоматически добавляет в класс метод __setattr__, который вызывает исключение FrozenInstanceError при попытке изменить атрибут. Однако во время выполнения __init__ этот метод временно отключается, чтобы можно было установить начальные значения.

from dataclasses import dataclass

@dataclass(frozen=True)
class Point:
    x: int
    y: int

p = Point(1, 2)
# p.x = 3  # Вызовет FrozenInstanceError

Детали реализации

Внутренне Python использует механизм, который позволяет методу __init__ устанавливать атрибуты, игнорируя блокировку. Это делается через прямой вызов object.__setattr__ внутри сгенерированного __init__. После завершения инициализации любые попытки изменить атрибуты через обычное присваивание приводят к ошибке.

Вывод

Использование frozen=True полезно для создания неизменяемых объектов, что повышает безопасность и предсказуемость кода, особенно в многопоточных средах или при работе с хешируемыми объектами.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • Python

    Python

Ключевые слова

#dataclass

#frozen

#immutable

#__setattr__

#python

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.