Python DataClasses: Полное руководство по объектам без шерсти

DataClass в Python — это способ хранить и организовать связанные значения структурированным, многократным образом. Но разве у нас уже нет словари, переменные и классы, чтобы сделать это на Python? Зачем нам нужен обработка данных?

Введение

Вот разница:

  • Переменная содержит одно значение (человек = «Джессика»).
  • Словарь содержит несколько связанных значений в формате ключа (Person = {«name»: «Jessica», «AGE»: 30, «Email»: «jessica@example.com»}) и хорошо для специальных или одноразовых данных.
  • Класс определяет план для объектов, которые могут содержать несколько значений и выполнять различные поведения.
  • DataClass — это оптимизированный класс, предназначенный для сохранения соответствующих значений (например, пример человека в словаре) с минимальным кодом шаблона. Чтобы не путать с словарем, обработки данных похожи на регулярные занятия. Они чертежи для объектов Python.

На первый взгляд, датчик может очень похож на словарь. Практическое практическое правило: используйте словарь для одного объекта или когда структура является динамической. Используйте DataClass, когда вы хотите создать несколько структурированных объектов с одинаковыми полями.

Как данные обработки данных, так и пары словарного хранилища. DataClass-это напечатанный объект с доступом к точечной нотации, встроенными методами, такими как __init__ и __REPR__, и простое сравнение между экземплярами.

Даваки также могут выглядеть похоже на классы Python. Используйте DataClass через обычный класс Python, когда вы хотите сохранить связанные данные, а не реализовать сложное поведение.

Зачем использовать DataClasses

Перед введением DataClass в выпуске Python 3.7 разработчикам все еще необходимо создавать объекты с соответствующими данными. Самым популярным выбором для этого были обычные занятия, словари и названные. Но все трое принесли свои собственные недостатки. Занятия требовали много ненужного, повторяющегося кода шаблона. Словары не могли быть автогенерированы и не имели подсказок типа. Названные по умолчанию были неизменны, имели ограниченную гибкость, и добавление значений по умолчанию и методов было трудоемким.

Итак, разработчики Python создали решение: обработки данных.

Разработчики могут написать более декларативный, поддерживаемый код с обработкой данных. Они уменьшают шаблон, автогенерируя общие методы. Они применяют подсказки типа. Вы также можете добавить более продвинутые функции с минимальным синтаксисом (неизменность, упорядочение и эффективное использование памяти).

Быстрый старт: объявление вашего первого обработки данных

Декоратор @DataClass отмечает класс в качестве обработки данных, сигнализируя о том, что он будет использоваться для хранения структурированных данных.

Выход:

3

5

Точка (x = 3, y = 5)

Автоматический __init__, __repr__ и __eq__

DataClass поставляются с этими встроенными методами (именно поэтому вы не видите никакого кода, добавленного для них).

  • __init__ Устанавливает поля объекта при его создании.
  • __REPR__ дает читаемое представление строки объекта.
  • __EQ__ позволяет сравнить два объекта по их значениям.

Определение полей и типов

В обратном данных вы определяете поля и их типы, перечисляя каждый атрибут с аннотацией типа внутри класса, например, x: int или name: str.

Требуется против дополнительных полей

По умолчанию обработки данных требуют все поля. Вы можете добавить значение или значение по умолчанию. Значение по умолчанию — это заданное значение, которое поле будет использовать, если вы не предоставите его при создании экземпляра. Значение по умолчанию может быть переопределено при создании экземпляра.

Выход:

Человек (имя = ‘jess’, возраст = 30)

Человек (имя = ‘dani’, возраст = 25)

Вы также можете сделать поле необязательным:

Типовые подсказки и статический анализ

Давакиса полагаются на подсказки типа. Подсказки типа — это аннотации, которые указывают ожидаемый тип данных переменной, параметр функции или возвращаемое значение в Python. Они выглядят так в кодовом названии: Str или возраст: Int. Типовые подсказки помогают уловить ошибки на ранних этапах статического анализа. Статический анализ использует такие инструменты, как Mypy и Ides, чтобы предупредить вас, если вы попытаетесь назначить значение неправильного типа. Это улучшает безопасность и читаемость кода.

Значения по умолчанию и default_factory

В Python использование изменяемого объекта (например, список или словаря) в качестве значения по умолчанию может вызвать неожиданное поведение, поскольку все экземпляры имеют один и тот же объект. Это называется изменчивой ловушкой по умолчанию. Чтобы предотвратить это, обработки данных предоставляют default_factory, который создает новый объект для каждого экземпляра:

Выход:

Участники команды1: [‘Leslie’]

Участники команды2: []

Идентификатор списка команды1: 4425609792

Идентификатор списка Team2: 4419089664

Контроль сгенерированных методов

Мы знаем, что обработки данных автоматически создают методы __init__, __repr__ и __eq__. Вы также можете настроить свой класс и контроль, какие методы генерируются и как они ведут себя.

Сравнения с порядком = true

@dataclass (order = true) генерирует методы сравнения, такие как <, <=,> и> = на основе порядка полей. Это позволяет легко сравнивать и сортировать экземпляры. Это полезно для списков объектов или приоритетов.

Выход:

Истинный

Истинный

[Item(price=5.49, name=’Pen’), Item(price=7.25, name=’Pencil’), Item(price=10.99, name=’Notebook’)]

Hashability и Frozen = True

Frozen = True делает экземпляры DataClass неизменными, что означает, что их поля не могут быть изменены после создания. Это также делает их хранением, поэтому их можно использовать в качестве словарных ключей или хранить в наборах. Это важно для создания безопасных, постоянных объектов, которые полагаются на стабильные значения.

Выход:

не может назначить поле «символ»

1.0

0,92

Настройка __post_init__

Метод __POST_INIT__ работает после инициализированного обработки данных, позволяя обеспечить соблюдение ограничений, проверять значения или выполнять дополнительную настройку. Это обеспечивает целостность данных без ручного написания инициализатора.

Выход:

Продукт (имя = ‘ноутбук’, цена = 1200,0)

Цена должна быть неотрицательной

Расширенные функции

DataClass предлагают еще несколько расширенных функций для повышения эффективности памяти, ясности кода и интеграции с современными функциями Python.

Слоты поддержка эффективности памяти

В Python 3.10+ вы можете использовать Slots = true, чтобы сообщить DataClass предопределить свои атрибуты, что уменьшает использование памяти и ускоряет доступ к атрибутам.

Поля только для ключевых слов (kw_only = true)

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

Сопоставление рисунков с обработкой данных

Вы можете соответствовать объектам на основе их поля (выпущенного в 3.10), потому что обработки данных плавно интегрируются с сопоставлением структурных схем.

Наследство и микшины

Наследование и микшины позволяют классам повторно использовать или расширять поведение и функциональность от других классов, делая код более модульным и проще в обслуживании.

Расширение данных (наследование)

Если вы работали с занятиями раньше, этот будет знаком. Дата -образные данные могут наследовать поля и поведение от других классов, аналогичных классам родителей и детей. В приведенном ниже примере детский класс дисконтированный продукт автоматически наследует имя и цену от продукта, поэтому вам нужно только определить, что нового (в данном случае, это скидка).

Выход:

DiscountedProduct (name = ‘ноутбук’, цена = 1200,0, скидка = 150,0)

Смешивание регулярных и обработанных баз

Вы можете комбинировать обработки данных с регулярными классами, чтобы «смешать» дополнительное поведение и методы. Этот подход позволяет объединить удобство обработки данных с дополнительной функциональностью. Если вы решите смешать, вы должны знать о своем порядке разрешения метода (MRO). MRO определяет, какой метод используется, если несколько базовых классов определяют один и тот же метод.

Выход:

Журнал: встреча в 10:00

Производительность и соображения памяти

Давакиссы удобны, но они используют больше памяти на экземпляр, потому что каждый объект хранит свои атрибуты в динамическом __dict__. __dict__ — это словарь Python, который отображает имена атрибутов на их значения. __Dict__ позволяет динамическому назначению и модификации атрибутов (добавить, изменить или удалять атрибуты во время выполнения). Гибкость удобна, но требует дополнительной памяти для хранения структуры словаря. Накладные расходы поступают из Python, который нуждается в поддержании динамического отображения для атрибутов каждого экземпляра. Это делает DataClasses использовать больше памяти, чем фиксированное хранилище, например, кортежи или слоты.

Существует более легкое решение для приложений, нуждающихся в тысячах или миллионах объектов обработки данных. В этих случаях вы можете использовать слоты = верно для определения поля. Это устраняет __DICT__ и уменьшает использование памяти, когда ускоряет доступ к атрибутам.

Почему бы не использовать слоты = true для всех приложений? Слоты = True не улучшение Catchall; Это особенно полезно в приложениях, где память представляет собой беспокойство. При работе только с небольшим количеством объектов улучшение памяти и скорости будет незначительным. Вы не можете добавить новые атрибуты динамически; Все поля должны быть предопределены, что может быть ограничительным. Это также усложняет наследование классов, особенно если вы смешиваете прорезинты и нерасположенные классы.

Общие ловушки и ограничения изменяемые значения по умолчанию

Давакилы делятся по умолчанию во всех случаях. Это означает, что использование изменяющихся объектов в качестве значений по умолчанию может привести к неожиданному поведению. Чтобы избежать неожиданного поведения, используйте default_factory для создания нового объекта для каждого экземпляра. default_factory гарантирует, что каждый экземпляр имеет свой собственный независимый объект.

Рекурсивные типы

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

Реальные варианты использования

Давайте посмотрим на некоторые обработки данных в дикой природе.

Объекты конфигурации

Давакилы идеально подходят для представления структурированных настроек в приложении. Вместо словаря с произвольными ключами вы можете определить обработку данных с определенными полями, подсказками и дефолтами типа, что улучшает читабельность, безопасность и обслуживаемость.

Выход:

AppConfig (host = ‘localhost’, port = 5000, debug = true)

Легкие DTO в APIS

Объекты передачи данных (DTO) являются полезными нагрузками и ответами в веб -службах. И когда вы используете обработку данных для их создания, они предоставляют четкий, структурированный формат для данных без написания словесных классов. DTOS, построенные с помощью данных DATACLASS, легко интегрируются с библиотеками сериализации.

Выход:

Userdto (id = 1, name = ‘jess’, email=’jess@example.com ‘)

Необываемые доменные сущности

DataClass с Frozen = True позволяют легко определить непостоянные доменные объекты в системах, где важна неизменность, например, дизайн, управляемый доменом (DDD). Это предотвращает ошибки и обеспечивает соблюдение бизнес -логики, потому что объекты Frozen = true нельзя изменить после ее создания.

Выход:

не может назначить поле «код»

Тестирование и отладка обработки данных

DataClasses — это уникальный класс, но многие советы отладки соответствуют тем, которые вы увидите с любым другим инструментом Python.

  • Подтвердовать рано: __post_init__ улавливает неверные значения, как только вы создаете объект.
  • Печать легко: __REPR__ показывает все поля, чтобы вы могли видеть, что находится внутри объекта.
  • Будьте осторожны с изменчивыми значениями, используйте замороженные классы (Frozen = true) при необходимости.

Заключение

Как и многие инструменты в Python, обработки данных могут показаться сложными, но с небольшой практикой они станут более управляемыми для работы. Они полезный инструмент для работы с несколькими экземплярами организованных данных. Как только вы почувствуете себя комфортно с ними, вы заметите, насколько чище и более читаемой ваш код становится. Они также помогают предотвратить общие ошибки, предоставляя структуру, подсказки типа и встроенные методы для сравнения и представления.

Trending Stories youtube.com/thenewstack Tech движется быстро, не пропустите эпизод. Подпишитесь на наш канал YouTube, чтобы транслировать все наши подкасты, интервью, демонстрации и многое другое. Группа подпишитесь с эскизом. Джессика Вахтел — писатель по маркетингу разработчиков в InfluxData, где она создает контент, который помогает сделать данные о мире временных рядов более понятными и доступными. Джессика имеет опыт работы в разработке программного обеспечения и технической журналистике. Подробнее от Джессики Вахтел

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *