TGViewer
Библиотека питониста | Python, Django, Flask Библиотека питониста | Python, Django, Flask @pyproglib · 37.3K subscribers
Post #7389 3.66K
ℹ️ Как `@dataclass` работает внутри — с примерами

В статье автор шаг за шагом пересобирает упрощённый @dataclass, показывая ключевые идеи.

➡️ Dataclass не оборачивает класс

В отличие от обычных декораторов, он:
— читает метаданные класса
— добавляет методы прямо в этот же класс
— возвращает тот же объект


def dataclass(cls):
# модифицируем cls
return cls


➡️ Поля берутся из __annotations__

Все поля dataclass — это просто type hints:

class User:
name: str
age: int

print(User.__annotations__)
# {'name': str, 'age': int}


Именно этот словарь используется для генерации __init__, __repr__ и других методов.

➡️ Генерация методов через exec

Одна из самых неочевидных частей: dataclass генерирует код как строки и выполняет его через exec.

Пример простейшего __init__, созданного динамически:

def __init__(self, name, age):
self.name = name
self.age = age


Этот код сначала собирается как строка, затем превращается в функцию и добавляется в класс через setattr.

➡️ Как работает frozen=True

Чтобы сделать объект неизменяемым:
— переопределяются __setattr__ и __delattr__
— любые попытки изменить поле → ошибка


def __setattr__(self, name, value):
raise Exception("Cannot assign to frozen dataclass")


Но есть нюанс: __init__ тоже использует __setattr__.

Поэтому внутри __init__ приходится писать так:

object.__setattr__(self, "age", age)


➡️ Автогенерация __repr__

__repr__ строится из self.__dict__:

def __repr__(self):
return f"User(name={self.name!r}, age={self.age!r})"


Флаг !r гарантирует, что значения форматируются через их __repr__, а не __str__.

➡️ Итоговая минимальная версия dataclass

В итоге кастомный @dataclass:
— читает __annotations__
— через exec создаёт __init__, __repr__
— опционально блокирует изменения (`frozen`)
— не создаёт новых объектов, а модифицирует существующий класс

⚠️ Отдельно отмечается: если нужны валидации типов — лучше смотреть в сторону Pydantic, который использует те же аннотации, но идёт дальше.

📖 Полный разбор — по ссылке.

📍 Навигация: Вакансии • Задачи • Собесы

🐸 Библиотека питониста

#буст
  • 👍 9
  • ❤ 4
More from @pyproglib
  1. Oct 3, 2026📚Напоминаем про наш полный курс «Самоучитель по Python для начинающих» Мы написали и собр…
  2. Oct 2, 2026🎹 Что делать после ChatGPT? Следующий шаг — AI-агенты. Они не просто отвечают на запросы,…
  3. Sep 30, 2026🔥 Последний день для разработчиков AI уже пишет код. Теперь важнее научиться встраивать е…
  4. Sep 25, 2026🔥 Курс «ИИ для разработчиков» уже стартовал И мы решили открыть первое занятие всем — мож…
  5. Sep 20, 2026👻 94% токенов уходят не на код Анализ запусков показал: основная часть токенов уходит на…
  6. Sep 19, 2026📚Напоминаем про наш полный курс «Самоучитель по Python для начинающих» Мы написали и собр…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →