Python Data Classes: оптимизация управления данными с современным синтаксисом
Python data class — это обычный Python-класс, у которого есть декоратор @dataclass. Он специально создан для хранения данных. Начиная с Python версии 3.7, Python предлагает дата-классы через встроенный модуль dataclass. Есть несколько преимуществ над обычными Python-классами, которые мы исследуем в этой статье. Мы также посмотрим на пример кода и пару распространенных операций, которые вы можете захотеть выполнить с дата-классами.
Содержание
Преимущество использования дата-классов
Почему вы должны использовать дата-класс вместо обычного Python-класса? Сначала давайте посмотрим на некоторые преимущества, которые Python дата-класс предлагает.
Требует минимальное количество кода
Декоратор @dataclass добавляет много функциональности классу без добавления видимого кода. Это позволяет вашему дата-классу быть очень компактным, в то время как он все еще предлагает много полезных функций. Все, что вам нужно сделать — определить поля для хранения ваших данных. Вам не нужно определять никакие функции.
Сравнение
Два Python дата-класса можно сравнивать с ==, потому что так называемый dunder-метод __eq__ реализован автоматически. В общем, мы можем сравнивать любой Python-объект, реализующий этот специальный метод, с другими объектами того же типа.
Печать дата-класса
Аналогично, потому что __repr__ реализован, вы можете печатать дата-классы и получать красивое представление их. Это особенно полезно для отладки.
Дата-классы требуют type hints
Дата-классы построены вокруг новой (или не совсем новой) системы типов, которую предлагает Python. Использование type hints снижает шансы на баги и неожиданное поведение в вашем коде. Вы по сути объявляете тип данных, который должен храниться в переменной.
Пример Python дата-класса
Вот пример дата-класса в работе:
from dataclasses import dataclass
@dataclass
class Card:
rank: str
suit: str
card1 = Card("Q", "hearts")
card2 = Card("Q", "hearts")
print(card1 == card2) # True
print(card1.rank) # 'Q'
print(card1)
Card(rank='Q', suit='hearts')
Значения по умолчанию
Дата-класс может иметь значения по умолчанию. Назначение значений по умолчанию так же просто, как назначение значения переменной. Например, чтобы наш класс Card имел значение по умолчанию Queen of hearts, мы можем сделать так:
from dataclasses import dataclass
@dataclass
class Card:
rank: str = 'Q'
suit: str = 'hearts'
Конвертация дата-класса в JSON
Частый случай использования — конвертация вашего хорошо структурированного дата-класса в JSON. Например, если вы хотите экспортировать данные в базу данных или отправить их в браузер. Плохая новость здесь: нет встроенного способа конвертировать дата-класс в JSON.
Хорошая новость в том, что есть Python-пакет под названием dataclasses-json, который упрощает задачу. Однако он требует дополнительный декоратор. Вам нужно установить пакет с командой pip install или чем-то вроде Pipenv, желательно внутри виртуального окружения. Например:
$ pip install dataclasses-json
Вот пример того, как вы можете использовать пакет:
from dataclasses import dataclass
from dataclasses_json import dataclass_json
@dataclass_json
@dataclass
class Card:
rank: str = 'Q'
suit: str = 'hearts'
card = Card()
print(card.to_json())
{"rank": "Q", "suit": "hearts"}
Другой метод — использовать Python-наследование и унаследоваться от класса JSONEncoder, чтобы создать свой собственный кастомный энкодер. Преимущество здесь в том, что вам не нужно устанавливать внешний пакет. Вы можете научиться делать это в этом блог-посте.
Продолжайте учиться
- Пакет Python attrs имеет продвинутую версию нативного Python дата-класса
- Официальная документация на Python.org
- Как вернуть несколько значений в Python
Python
- Освоение типов данных в Python: практическое руководство
- Мастерство преобразования типов в Python: Полное руководство
- Мастерство операторов Python: Полное руководство
- Пользовательские исключения в Python: практическое руководство
- Объектно-ориентированное программирование в Python: классы, наследование, инкапсуляция и полиморфизм
- Наследование в Python: концепции, синтаксис и практические примеры
- Консолидация дата-центров: сокращение затрат, усиление безопасности, повышение эффективности
- Понимание type() и isinstance() в Python: практические примеры
- Структуры данных в Java: основные классы и Collections Framework
- Абстракция данных в C++: разделение интерфейса и реализации