Đoạn xem trước bài giảng

Классы и dataclasses в Python: ООП без лишнего кода

Классы, атрибуты, методы, наследование, dataclass. Для опытных: Self (3.11), @override (3.12), slots=True и что разрешили в __slots__ в 3.15.

класс объект наследование dataclass
Bạn sẽ học gì trong bài giảng này
  • Описывать сущности классами
  • Сокращать код через dataclass
  • Ловить ошибки переопределения через @override

Phần đầu bài giảng

Опечатка «amout» — и отчёт молча врёт

  • dict: набор ключей не фиксирован
  • Класс: поля объявлены заранее
  • Ошибка — в момент обращения, а не в отчёте

Помните, трата у нас хранится в словаре? Где-то в глубине отчёта кто-то пишет get с ключом amout — без буквы n — и значением по умолчанию ноль. Никакой ошибки: словарь не знает, какие ключи правильные, и честно возвращает ноль. Итог за месяц занижен, и никто не понимает почему. Если же трата — объект своего класса с объявленными полями, такая опечатка мгновенно упадёт с подсказкой из прошлой лекции. Давайте построим этот класс.

row = {"item": "Кофе", "amount": 250}
print(row.get("amout", 0))     # 0 — тишина

expense = Expense("Кофе", 250)
expense.amout
# AttributeError: 'Expense' object has no attribute
# 'amout'. Did you mean '.amount' instead of '.amout'?

Класс — чертёж, объект — изделие

  • class — описание типа
  • Объект (экземпляр) — конкретная трата
  • __init__ заполняет поля нового объекта
  • self — ссылка на сам объект

Класс — это чертёж. Он описывает, какие поля есть у траты и что с ней можно делать. А объект — конкретное изделие по этому чертежу: кофе за двести пятьдесят, такси за триста. Специальный метод с двумя подчёркиваниями вокруг слова init вызывается при создании объекта и раскладывает переданные значения по полям. А слово self внутри методов означает «этот самый объект», с которым сейчас работаем. Его Python подставляет сам.

class Expense:
    def __init__(self, item: str, amount: float,
                 category: str = "Прочее"):
        self.item = item              # поля объекта
        self.amount = amount
        self.category = category

coffee = Expense("Кофе", 250)        # объект
taxi = Expense("Такси", 300, "Транспорт")
print(coffee.item, taxi.amount)

Методы и __repr__: объект, который умеет и рассказывает

  • Метод — функция внутри класса, первый аргумент self
  • __repr__ — как объект выглядит в print и отладчике
  • Без __repr__: <__main__.Expense object at 0x7f...>

Данные без действий — полдела. Методы — это функции, живущие внутри класса: трата может сама посчитать свою сумму с налогом. Вызываются через точку, и Python сам передаёт объект первым аргументом. А ещё полезно научить объект себя показывать. По умолчанию print выведет загадочный адрес в памяти. Специальный метод repr возвращает понятную строку, и отладка сразу становится приятнее: в списке трат видно, что это за траты.

class Expense:
    def __init__(self, item: str, amount: float):
        self.item = item
        self.amount = amount

    def with_vat(self, rate: float = 0.2) -> float:
        return self.amount * (1 + rate)

    def __repr__(self) -> str:
        return f"Expense({self.item!r}, {self.amount})"

e = Expense("Кофе", 250)
print(e, e.with_vat())

Bài giảng đầy đủ dành cho thuê bao

Còn 9 slide nữa trong phiên bản đầy đủ.

Video, toàn bộ slide, ghi chú, bài kiểm tra, gia sư AI và phỏng vấn sẽ mở sau khi đăng nhập và đăng ký thuê bao.

Đăng nhập hoặc đăng ký Đăng ký thuê bao

Nội dung bài giảng

  1. Опечатка «amout» — и отчёт молча врёт
  2. Класс — чертёж, объект — изделие
  3. Методы и __repr__: объект, который умеет и рассказывает
  4. @dataclass: класс без шаблонного кода
  5. @property: вычисляемое поле
  6. Наследование: месячный отчёт на базе обычного
  7. Миф: ООП — это всегда глубокие иерархии
  8. ❓ Стоп-проверка: что сломается?
  9. 💡 Разбор: FrozenInstanceError и dataclasses.replace
  10. Что нового: Self (3.11) и @override (3.12)
  11. Что нового: __slots__ для наследников tuple (3.15)
  12. Итог: трата — dataclass, отчёт — класс с итогом

Bài viết liên quan đến bài học này

Tất cả bài giảng của khóa học

  1. Python 3.15 с нуля и для опытных: что нового и как учить
  2. Python 3.15: установка, REPL и первый скрипт за десять минут
  3. Переменные, числа и строки в Python: f-строки и t-строки
  4. Условия, циклы и match/case в Python: управляем ходом программы
  5. Списки, кортежи, словари и множества: frozendict в Python 3.15
  6. Comprehensions в Python: распаковка * и ** внутри (PEP 798)
  7. Функции и аннотации типов в Python: от def до sentinel
  8. Ошибки и исключения в Python 3.15: читаем трейсбек и подсказки «Did you mean»
  9. Модули, пакеты и ленивые импорты в Python 3.15 (PEP 810)
  10. Файлы, JSON и CSV в Python: pathlib и UTF-8 по умолчанию
  11. Классы и dataclasses в Python: ООП без лишнего кода
  12. Асинхронность и потоки в Python: asyncio, TaskGroup и free-threading
  13. Профилирование Python 3.15: Tachyon вместо cProfile и итоговый проект