Sehemu ya muhadhara

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

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

класс объект наследование dataclass
Utakachojifunza katika muhadhara huu
  • Описывать сущности классами
  • Сокращать код через dataclass
  • Ловить ошибки переопределения через @override

Mwanzo wa muhadhara

Опечатка «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())

Muhadhara kamili unapatikana kwa usajili

Kuna slaidi 9 zaidi katika toleo kamili.

Video, slaidi zote, maelezo, majaribio, AI tutor na mahojiano vitafunguka baada ya kuingia na kujisajili.

Ingia au jisajili Jiandikishe

Yaliyomo kwenye muhadhara

  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, отчёт — класс с итогом

Makala kuhusu somo hili

Mihadhara yote ya kozi hii

  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 и итоговый проект