Определение датакласса
Используйте @dataclass, чтобы убрать шаблонный код
«Определение датакласса» — бесплатный урок Python Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Зачем нужны датаклассы?
Когда Вы пишете класс, который в основном хранит данные, приходится повторять один и тот же шаблонный код: __init__, __repr__ и __eq__. Модуль датаклассов создаёт всё это за Вас на основе простых объявлений полей.
- Меньше кода для написания и чтения.
- Меньше шансов допустить опечатку в
__init__. - Входит в стандартную библиотеку начиная с Python 3.7.
Старый способ
Вот обычный класс, который хранит точку. Обратите внимание, сколько кода требуется написать всего лишь для хранения двух чисел.
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(1, 2)
print(p.x, p.y)Декоратор @dataclass
Поместите @dataclass перед классом и объявите поля с помощью аннотаций типов. Python автоматически создаст __init__.
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(1, 2)
print(p.x, p.y)Автоматическое представление объекта
Датаклассы также создают удобное для чтения __repr__, поэтому при выводе объекта отображаются его поля, а не адрес в памяти.
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
print(Point(3, 4))Автоматическое сравнение
Два экземпляра датакласса считаются равными, если равны все их поля. Вам не нужно писать __eq__ вручную.
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
print(Point(1, 2) == Point(1, 2))
print(Point(1, 2) == Point(9, 9))Аннотации типов обязательны
У каждого поля должна быть аннотация типа. Именно аннотация сообщает механизму датаклассов, что это имя является полем. Простое присваивание без аннотации создаёт обычный атрибут класса, а не поле.
from dataclasses import dataclass
@dataclass
class User:
name: str
age: int
u = User('Alice', 30)
print(u)Добавление методов
Датакласс остаётся обычным классом. Вы можете добавлять обычные методы, использующие созданные поля.
from dataclasses import dataclass
@dataclass
class Rectangle:
width: int
height: int
def area(self):
return self.width * self.height
r = Rectangle(3, 4)
print(r.area())Изменение полей
По умолчанию экземпляры датаклассов можно изменять, поэтому после создания Вы можете переназначать поля так же, как обычные атрибуты.
from dataclasses import dataclass
@dataclass
class Counter:
value: int
c = Counter(0)
c.value += 5
print(c.value)asdict и astuple
Вспомогательные функции asdict() и astuple() преобразуют экземпляр в словарь или кортеж, что удобно для сериализации.
from dataclasses import dataclass, asdict, astuple
@dataclass
class Point:
x: int
y: int
p = Point(1, 2)
print(asdict(p))
print(astuple(p))Вложенные датаклассы
Полем датакласса сам может быть другой датакласс. Созданные __repr__ и asdict() рекурсивно обрабатывают вложенные структуры.
from dataclasses import dataclass, asdict
@dataclass
class Address:
city: str
@dataclass
class Person:
name: str
address: Address
p = Person('Bob', Address('Paris'))
print(asdict(p))Когда использовать датаклассы
Выбирайте датакласс, когда класс в основном объединяет связанные значения.
- Объекты конфигурации.
- Записи, возвращаемые функцией.
- Простые типы значений, например координаты или денежные суммы.
Для классов, в которых преобладает поведение, а не данные, обычный класс может читаться понятнее.
Быстрая проверка
Что декоратор @dataclass создаёт автоматически?
Повторение
Вы научились использовать @dataclass, чтобы избавиться от шаблонного кода.
- Объявляйте поля с помощью аннотаций типов.
__init__,__repr__и__eq__создаются автоматически.- Используйте
asdict()иastuple()для преобразования экземпляров. - Вы по-прежнему можете добавлять методы и вкладывать датаклассы друг в друга.
Часто задаваемые вопросы
Урок «Определение датакласса» бесплатный?
Да — полный текст урока «Определение датакласса» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «Определение датакласса»?
Используйте @dataclass, чтобы убрать шаблонный код Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Определение датакласса»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Определение датакласса
- Значения по умолчанию и field()
- Параметры неизменяемости и сравнения
- Библиотека attrs