0Pricing
Python Academy · Урок

Определение датакласса

Используйте @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 — локальная установка не требуется.

Все уроки этого курса

  1. Определение датакласса
  2. Значения по умолчанию и field()
  3. Параметры неизменяемости и сравнения
  4. Библиотека attrs
← Назад к Python Academy