Классы и dataclasses в Python: ООП без лишнего кода
Классы, атрибуты, методы, наследование, dataclass. Для опытных: Self (3.11), @override (3.12), slots=True и что разрешили в __slots__ в 3.15.
- Описывать сущности классами
- Сокращать код через dataclass
- Ловить ошибки переопределения через @override
Anfang der Lektion
Опечатка «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())
Die vollständige Lektion — mit Abo
Noch 9 Folien in der vollständigen Version.
Video, alle Folien, Notizen, Tests, KI-Tutor und Interview werden nach Anmeldung und Abschluss eines Abos freigeschaltet.
Anmelden oder registrieren Abo abschließenInhalt der Lektion
- Опечатка «amout» — и отчёт молча врёт
- Класс — чертёж, объект — изделие
- Методы и __repr__: объект, который умеет и рассказывает
- @dataclass: класс без шаблонного кода
- @property: вычисляемое поле
- Наследование: месячный отчёт на базе обычного
- Миф: ООП — это всегда глубокие иерархии
- ❓ Стоп-проверка: что сломается?
- 💡 Разбор: FrozenInstanceError и dataclasses.replace
- Что нового: Self (3.11) и @override (3.12)
- Что нового: __slots__ для наследников tuple (3.15)
- Итог: трата — dataclass, отчёт — класс с итогом
Artikel zum Thema der Lektion
- Klassen und OOP in Python: __init__, self, Methoden, Vererbung und dataclass
- Python herunterladen und installieren unter Windows, macOS und Linux: Schritt für Schritt
- Python von null lernen: ein Lernplan für Einsteiger Schritt für Schritt
- Dictionaries in Python (dict): Anlegen, Methoden, Durchlaufen, Sortieren und frozendict
- Listen in Python (list): Methoden, Slices, Sortierung, append, Tupel und Mengen
Alle Lektionen des Kurses
- 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 и итоговый проект