Классы и dataclasses в Python: ООП без лишнего кода
Классы, атрибуты, методы, наследование, dataclass. Для опытных: Self (3.11), @override (3.12), slots=True и что разрешили в __slots__ в 3.15.
- Описывать сущности классами
- Сокращать код через dataclass
- Ловить ошибки переопределения через @override
بداية الدرس
Опечатка «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())
الدرس الكامل متاح بالاشتراك
و9 شريحة أخرى في النسخة الكاملة.
تُفتح الفيديو وجميع الشرائح والملاحظات والاختبارات والمرشد الذكي والمقابلة بعد تسجيل الدخول والاشتراك.
تسجيل الدخول أو إنشاء حساب الاشتراك الآنمحتوى الدرس
- Опечатка «amout» — и отчёт молча врёт
- Класс — чертёж, объект — изделие
- Методы и __repr__: объект, который умеет и рассказывает
- @dataclass: класс без шаблонного кода
- @property: вычисляемое поле
- Наследование: месячный отчёт на базе обычного
- Миф: ООП — это всегда глубокие иерархии
- ❓ Стоп-проверка: что сломается?
- 💡 Разбор: FrozenInstanceError и dataclasses.replace
- Что нового: Self (3.11) и @override (3.12)
- Что нового: __slots__ для наследников tuple (3.15)
- Итог: трата — dataclass, отчёт — класс с итогом
مقالات حول هذا الدرس
- الأصناف في Python: البرمجة الكائنية والوراثة وdataclasses بأمثلة عملية
- كيفية تحميل Python وتثبيته على Windows وmacOS وLinux: خطوات بالتفصيل
- النصوص في Python: split وreplace وstrip وjoin والشرائح وf-strings
- الوحدات والحزم في Python: import وpip وvenv والمكتبات بكلمات بسيطة
- كيف تتعلم Python من الصفر: خطة تعلم للمبتدئين خطوة بخطوة
جميع دروس هذه الدورة
- Python 3.15 с нуля и для опытных: что нового и как учить
- Python 3.15: установка, REPL и первый скрипт за десять минут
- Переменные, числа и строки в Python: f-строки и t-строки
- Условия, циклы и match/case в Python: управляем ходом программы
- Списки, кортежи, словари и множества: frozendict в Python 3.15
- Comprehensions в Python: распаковка * и ** внутри (PEP 798)
- Функции и аннотации типов в Python: от def до sentinel
- Ошибки и исключения в Python 3.15: читаем трейсбек и подсказки «Did you mean»
- Модули, пакеты и ленивые импорты в Python 3.15 (PEP 810)
- Файлы, JSON и CSV в Python: pathlib и UTF-8 по умолчанию
- Классы и dataclasses в Python: ООП без лишнего кода
- Асинхронность и потоки в Python: asyncio, TaskGroup и free-threading
- Профилирование Python 3.15: Tachyon вместо cProfile и итоговый проект