<MyRusakov.ru />

Создание игр на Unreal Engine 5

Создание игр на Unreal Engine 5

Данный курс научит Вас созданию игр на Unreal Engine 5. Курс состоит из 12 модулей, в которых Вы с нуля освоите этот движок и сможете создавать самые разные игры.

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

Помимо самого курса Вас ждёт ещё 8 бесплатных ценных Бонусов: «Chaos Destruction», «Разработка 2D-игры», «Динамическая смена дня и ночи», «Создание динамической погоды», «Создание искусственного интеллекта для NPC», «Создание игры под мобильные устройства», «Создание прототипа RPG с открытым миром» и и весь курс «Создание игр на Unreal Engine 4» (актуальный и в 5-й версии), включающий в себя ещё десятки часов видеоуроков.

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Dataclasses в Python: понятное руководство с примерами и лучшими практиками

Dataclasses в Python: понятное руководство с примерами и лучшими практиками

Dataclasses в Python — это способ описывать данные компактно и понятно, не вручную прописывая __init__, __repr__, __eq__ и другую рутину. Для новичков и продолжающих разработчиков это один из самых полезных инструментов повседневной разработки: меньше кода — меньше ошибок и больше читаемости.

Что такое dataclasses в Python и когда их использовать

Модуль dataclasses (стандартная библиотека) позволяет объявлять классы данных с помощью декоратора @dataclass. Он автоматически генерирует конструктор, методы сравнения, человекочитаемое представление и многое другое. Используйте dataclasses в Python, когда вам нужны «контейнеры» с полями и минимальной логикой: сущности доменной модели, DTO, настройки, результаты функций и т.п.

Быстрый старт: @dataclass за 2 минуты

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int = 0  # значение по умолчанию

p1 = Person("Алиса", 30)
p2 = Person("Алиса", 30)
print(p1)         # Person(name='Алиса', age=30)
print(p1 == p2)   # True — сравнение по полям

Три вещи сразу готовы: конструктор, repr и равенство по значению полей. Без шаблонного кода!

field и default_factory: аккуратно с изменяемыми значениями

Частая ошибка — использовать изменяемое значение по умолчанию (например, список). Делать так нельзя: все экземпляры будут делить один и тот же объект. Правильно — применить default_factory через field.

from dataclasses import dataclass, field
from typing import List

@dataclass
class Order:
    customer: str
    items: List[str] = field(default_factory=list)

    def add_item(self, name: str) -> None:
        self.items.append(name)

order = Order("Иван")
order.add_item("Кофе")
print(order.items)  # ['Кофе']

Запомнить правило просто: для списков, словарей, множеств и других изменяемых структур используйте default_factory.

Иммутабельность: frozen=True и hash

Иногда объекты должны быть неизменяемыми (например, ключи словаря). Поможет параметр frozen=True: попытка изменить поле вызовет ошибку, а сам объект можно безопасно использовать в set и как ключ dict (если все поля хешируемые).

from dataclasses import dataclass

@dataclass(frozen=True)
class Product:
    sku: str
    price: float

p = Product("A-001", 9.99)
# p.price = 10.99  # dataclasses.FrozenInstanceError
s = {p}
print(p in s)  # True

По умолчанию при frozen=True и eq=True хеш корректно генерируется, так что объект готов к использованию в хеш-коллекциях.

Сравнение и сортировка: order, compare=False

Если нужно сравнивать экземпляры по порядку (, =), включите order=True. Иногда полезно исключить поле из сравнения — например, метку времени. Для этого используйте compare=False в field.

from dataclasses import dataclass, field
from time import time

@dataclass(order=True)
class Score:
    points: int
    created_at: float = field(default_factory=time, compare=False)

s1 = Score(10)
s2 = Score(20)
print(s1 < s2)  # True — сравнение только по points

Инициализация после конструктора: __post_init__

Иногда нужно «досчитать» поле после автогенерированного __init__. Используйте метод __post_init__. Поля, которые не должны задаваться из конструктора, объявляйте с init=False.

from dataclasses import dataclass, field

@dataclass
class Article:
    title: str
    slug: str = field(init=False)

    def __post_init__(self):
        self.slug = (
            self.title.strip().lower()
            .replace(" ", "-")
            .replace("—", "-")
        )

a = Article("Dataclasses в Python — кратко")
print(a.slug)  # dataclasses-v-python-—-kratko -> после предобработки

asdict, astuple, replace и metadata

Для преобразования экземпляров удобно использовать утилиты из модуля dataclasses:

  • asdict(obj) — глубокое преобразование в словарь;
  • astuple(obj) — кортеж значений по порядку полей;
  • replace(obj, **changes) — копия с изменёнными полями.
from dataclasses import dataclass, asdict, astuple, replace, field

@dataclass
class Config:
    host: str
    port: int
    # можно хранить произвольные метаданные о поле
    env: str = field(default="dev", metadata={"allowed": ["dev", "prod"]})

cfg = Config("localhost", 8000)
print(asdict(cfg))       # {'host': 'localhost', 'port': 8000, 'env': 'dev'}
print(astuple(cfg))      # ('localhost', 8000, 'dev')
cfg2 = replace(cfg, port=8001)
print(cfg2)              # Config(host='localhost', port=8001, env='dev')
print(cfg.__dataclass_fields__["env"].metadata)

metadata удобно использовать для валидации, генерации форм или автодокументации — храните подсказки рядом с полями.

Методы в dataclasses — это нормально

Датаклассы — не только «мешки с данными». Вы можете добавлять методы, инкапсулировать простую бизнес-логику и следить за инвариантами.

from dataclasses import dataclass, field
from typing import List

@dataclass
class Cart:
    items: List[tuple[str, float]] = field(default_factory=list)

    def add(self, name: str, price: float) -> None:
        if price < 0:
            raise ValueError("Цена не может быть отрицательной")
        self.items.append((name, price))

    def total(self) -> float:
        return round(sum(p for _, p in self.items), 2)

cart = Cart()
cart.add("Кофе", 3.5)
cart.add("Батончик", 1.2)
print(cart.total())  # 4.7

Частые ошибки и лучшие практики

  • Используйте type hints для всех полей — без аннотаций dataclass не увидит поле.
  • Для изменяемых полей применяйте default_factory, а не значение по умолчанию.
  • Если объект должен быть ключом в dict/set — рассмотрите frozen=True и убедитесь, что поля хешируемые.
  • Исключайте «шумные» поля из сравнения с compare=False для корректной сортировки и eq.
  • Используйте __post_init__ для вычисляемых или нормализованных значений.
  • Не переусложняйте: если логики слишком много — возможно, это не «просто данные», и обычный класс уместнее.

Короткое резюме

Dataclasses в Python упрощают жизнь: меньше кода, больше структуры. Они отлично подходят для моделей данных, настроек и транспортных объектов. Освоив @dataclass, field, default_factory, frozen, order, asdict/astuple и replace, вы закроете 90% повседневных сценариев.

Хотите быстро и системно прокачаться в Python с практикой и разбором реальных задач? Загляните в курс: Пойти на мощный практический курс «Python с Нуля до Гуру» →

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (https://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: https://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: https://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.