С помощью PEP 557 классы данных вводятся в стандартную библиотеку Python.
Они используют @dataclass
декоратор, и они должны быть «изменяемыми именованными кортежами по умолчанию», но я не совсем уверен, что понимаю, что это на самом деле означает и чем они отличаются от обычных классов.
Что такое классы данных Python и когда их лучше всего использовать?
python
class
python-3.7
python-dataclasses
kingJulian
источник
источник
namedtuple
s являются неизменяемыми и не могут иметь значений по умолчанию для атрибутов, тогда как классы данных изменяемы и могут иметь их.@dataclass
не приведет к распаду сайта.namedtuples
МОЖЕТ иметь значения по умолчанию. Посмотрите здесь: stackoverflow.com/questions/11351032/…Ответы:
Классы данных - это просто обычные классы, которые предназначены для хранения состояния, а не содержат много логики. Каждый раз, когда вы создаете класс, который в основном состоит из атрибутов, вы создали класс данных.
Что
dataclasses
модуль делает делает его легче создавать классы данных. Он позаботится о большом количестве котельной для вас.Это особенно важно, когда ваш класс данных должен быть хешируемым; для этого требуется
__hash__
метод, а также__eq__
метод. Если вы добавите собственный__repr__
метод для упрощения отладки, он может стать довольно подробным:С
dataclasses
его помощью вы можете уменьшить его до:Тот же декоратор класса может также генерировать методы сравнения (
__lt__
,__gt__
и т. Д.) И обрабатывать неизменяемость.namedtuple
классы также являются классами данных, но по умолчанию неизменяемы (а также являются последовательностями).dataclasses
гораздо более гибки в этом отношении и могут быть легко структурированы так, чтобы выполнять ту же роль, что иnamedtuple
класс .PEP был вдохновлен
attrs
проектом , который может делать даже больше (включая слоты, валидаторы, конвертеры, метаданные и т. Д.).Если вы хотите увидеть несколько примеров, которые я недавно использовал
dataclasses
для нескольких своих решений Advent of Code , см. Решения для дней 7 , 8 , 11 и 20 .Если вы хотите использовать
dataclasses
модуль в версиях Python <3.7, вы можете установить модуль с обратным переносом (требуется 3.6) или использоватьattrs
проект, упомянутый выше.источник
@dataclass
генерирует примерно тот же__init__
метод сquantity_on_hand
аргументом ключевого слова со значением по умолчанию. Когда вы создаете экземпляр, онquantity_on_hand
всегда устанавливает атрибут экземпляра. Итак, мой первый пример, не относящийся к классу данных, использует тот же шаблон, чтобы повторить то, что будет делать код, сгенерированный классом данных.__post_init__
методе.обзор
Вопрос решен. Однако этот ответ добавляет несколько практических примеров, чтобы помочь в базовом понимании классов данных.
namedtuple
и другие .Вот что означает последняя фраза:
namedtuple
к классу или обычному классу.По сравнению с обычными классами вы в первую очередь экономите на вводе стандартного кода.
Характеристики
Это обзор функций класса данных (TL; DR? См. Сводную таблицу в следующем разделе).
Что вы получаете
Вот функции, которые вы получаете по умолчанию от классов данных.
Атрибуты + Представление + Сравнение
Эти значения по умолчанию предоставляются путем автоматической установки следующих ключевых слов
True
:Что можно включить
Дополнительные функции доступны, если для соответствующих ключевых слов установлено значение
True
.порядок
Теперь реализованы методы упорядочения (операторы перегрузки :)
< > <= >=
, аналогичноfunctools.total_ordering
более строгим проверкам на равенство.Hashable, изменяемый
Хотя объект потенциально является изменяемым (возможно, нежелательным), реализован хэш.
Hashable, неизменяемый
Теперь реализован хэш, и изменение объекта или присвоение атрибутов запрещено.
В целом объект является хешируемым, если либо
unsafe_hash=True
либоfrozen=True
.См. Также исходную таблицу логики хеширования с более подробной информацией.
Что вы не получите
Чтобы получить следующие возможности, необходимо вручную реализовать специальные методы:
Распаковка
оптимизация
Теперь размер объекта уменьшен:
В некоторых случаях
__slots__
также увеличивает скорость создания экземпляров и доступа к атрибутам. Также слоты не допускают назначения по умолчанию; в противном случае возникает aValueError
.Узнайте больше о слотах в этом сообщении в блоге .
Таблица результатов
+ Эти методы не создаются автоматически и требуют ручной реализации в классе данных.
*
__ne__
не требуется и, следовательно, не реализуется .Дополнительные возможности
После инициализации
наследование
Конверсии
Преобразование DATACLASS в кортеж или Dict, рекурсивно :
Ограничения
Ссылки
источник
Из спецификации PEP :
@dataclass
Генератор добавляет методы к классу , который вы бы иначе определять себя как__repr__
,__init__
,__lt__
и__gt__
.источник
Рассмотрим этот простой класс
Foo
Вот
dir()
встроенное сравнение. Слева -Foo
декоратор @dataclass без декоратора, а справа - декоратор @dataclass.Вот еще одно различие после использования
inspect
модуля для сравнения.источник