Нашли ошибку?

Курс с нуля

ООП в Python

Классы и объекты с нуля: от первого класса до программы из нескольких классов — свойства, магические методы, наследование, абстрактные классы, dataclass и свои исключения — на сквозном примере кассы кофейни.

9 модулей35 уроков≈ 12 ч
пройдено 0 из 35
Начать курс

Для кого

Для тех, кто пишет на Python простые программы с функциями, списками и словарями, а классы видел только в чужом коде. После курса вы спроектируете небольшую программу из нескольких классов и будете уверенно читать классы библиотек.

Что нужно знать

  • Базовый Python: переменные, списки, словари, циклы, функции с параметрами и return. Проверить себя — первый урок курса, «Python-минимум».
  • Курсы NumPy и pandas не нужны: в этом курсе только стандартный Python.
  • Установка ничего не нужна: код выполняется прямо в браузере. Любой урок можно скачать как .ipynb и пройти в Jupyter или Google Colab (Python 3.10 и новее).

Как устроены уроки

Урок — это ноутбук: короткое объяснение, код, который можно выполнить и изменить, упражнения с проверкой и вопросы. Python работает прямо в браузере; урок можно скачать как .ipynb для Jupyter или Colab.

Программа

Модуль 1

Первые классы

Что такое объект и класс, как объявить свой класс, заполнить экземпляр в __init__ и научить его методам.

  1. Python-минимумСамопроверка перед курсом — словари, циклы, генераторы списков, функции и try/except. Если всё решается легко, вы готовы.15 мин
  2. Всё в Python — объектУ каждого значения есть тип — класс, который определяет, что значение умеет. type, isinstance и методы строк и списков как поведение объекта.15 мин
  3. Первый классОбъявить свой класс словом class, создать экземпляры вызовом класса и записать в них атрибуты — и понять, почему записывать атрибуты снаружи неудобно.15 мин
  4. __init__ и selfМетод __init__ заполняет атрибуты нового экземпляра сразу при создании, а self — это сам этот экземпляр. Параметры, значения по умолчанию и забытый self.20 мин
  5. МетодыМетод — функция внутри класса, которая работает с данными своего экземпляра. Метод, который возвращает результат, и метод, который меняет атрибуты; забытый self и вызов без скобок.20 мин
  6. мини-проектМини-проект: ценникКласс Product для меню «Кофейной лавки»: цена за 100 мл, цена со скидкой и строка ценника, каталог из экземпляров и самый выгодный напиток.20 мин
После модуля вы умеете
  • объяснить, что такое объект, класс и экземпляр, и узнать тип значения: type, isinstance
  • объявить класс с __init__ и методами
  • создать несколько экземпляров и работать с их атрибутами
  • объяснить, что такое self и почему его нужно писать
Модуль 2

Состояние объектов

Где живут атрибуты: у экземпляра и у класса. Объекты внутри списков и других объектов, ссылки и общие изменяемые данные.

  1. Атрибуты класса и экземпляраАтрибут класса общий для всех экземпляров, атрибут экземпляра — у каждого свой. Константы класса, порядок поиска атрибута и список в атрибуте класса, который делят все.20 мин
  2. Объекты в списках и ссылкиПеременная не хранит объект, а ссылается на него. Две переменные — один объект, оператор is, изменение через ссылку, объекты в списках и изменяемое значение по умолчанию.20 мин
  3. мини-проектМини-проект: корзинаКласс Cart хранит товары в списке: добавить, убрать, посчитать сумму, найти самый дорогой. Две независимые корзины и товар, который лежит в обеих.20 мин
После модуля вы умеете
  • отличить атрибут класса от атрибута экземпляра и объяснить, где Python ищет атрибут
  • понять, когда две переменные ссылаются на один объект: is и ==
  • хранить объекты внутри объекта — корзина с товарами
  • избегать общих изменяемых данных: список в атрибуте класса и изменяемое значение по умолчанию
Модуль 3

Инкапсуляция и свойства

Как спрятать внутреннее состояние объекта и не дать испортить его снаружи: соглашение об именах, свойства и проверка значений.

  1. Что трогать снаружи: _ и __Публичный интерфейс класса и внутренние атрибуты с подчёркиванием. Изменение состояния через методы с проверками и искажение имён у __x.15 мин
  2. СвойстваДекоратор @property превращает метод в атрибут, который читается без скобок, — вычисляемый и только для чтения. Когда писать свойство, а когда метод.15 мин
  3. Сеттер и проверка значений@x.setter разрешает запись в свойство и проверяет значение: неверное — raise ValueError. Проверка в __init__ через свойство и рекурсия в сеттере.20 мин
  4. мини-проектМини-проект: карта лояльностиКласс LoyaltyCard: баллы только для чтения, начисление и списание с проверками, уровень карты — вычисляемое свойство. Покупки нескольких клиентов и золотые карты.25 мин
После модуля вы умеете
  • отделить публичный интерфейс класса от внутренних атрибутов: _x и __x
  • сделать вычисляемый атрибут и атрибут только для чтения: @property
  • проверять значения в сеттере и выбрасывать ValueError
  • выбирать между методом и свойством
Модуль 4

Представление и сравнение

Магические методы, которые делают объекты удобными: понятный вывод при отладке, равенство, сортировка и место в set и dict.

  1. Как объект выглядит: __repr__ и __str__Магические методы — способ встроить свой класс в язык. __repr__ — представление для отладки, __str__ — для людей, repr() и !r в f-строках.15 мин
  2. Равенство: __eq____eq__ задаёт, когда два объекта равны по смыслу. == против is, NotImplemented для чужого типа, __hash__ — и почему объект пропал из set.25 мин
  3. Сортировка объектов__lt__ учит объекты сравниваться на «меньше» — и начинают работать sorted, min и max. @total_ordering дописывает остальные сравнения, а key= сортирует без магических методов.20 мин
  4. мини-проектМини-проект: прайс-листДва прайса поставщика сводятся в один: товары с __repr__, __eq__ и __hash__, дубли убирает set, сортировка по цене и по названию, товары, у которых изменилась цена.20 мин
После модуля вы умеете
  • задать представление объекта для отладки и для людей: __repr__ и __str__
  • сравнивать объекты по смыслу: __eq__, NotImplemented, __hash__
  • сортировать объекты и искать минимум и максимум: __lt__, @total_ordering, key=
  • класть свои объекты в set и делать ключами dict
Модуль 5

Наследование и полиморфизм

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

  1. Наследованиеclass B(A): подкласс получает атрибуты и методы базового класса, может добавить свои и переопределить чужие. isinstance и issubclass в иерархии и проверки не в том порядке.20 мин
  2. super()super() вызывает метод базового класса из подкласса: свой __init__ с дополнительными атрибутами, расширение метода вместо копирования, порядок поиска методов MRO и забытый super().__init__.20 мин
  3. Полиморфизм и утиная типизацияОдин и тот же вызов — разное поведение у разных классов. Функция, которой неважен класс объекта, утиная типизация и новый класс, который встраивается в готовый код.20 мин
  4. мини-проектМини-проект: скидкиИерархия скидок: базовый Discount и подклассы PercentDiscount, FixedDiscount и BuyNGetOne. Касса применяет любую скидку одним вызовом и выбирает самую выгодную.25 мин
После модуля вы умеете
  • строить небольшие иерархии классов: class B(A), переопределение методов, isinstance и issubclass
  • расширять поведение базового класса через super()
  • писать код, которому неважен конкретный класс: полиморфизм и утиная типизация
Модуль 6

Абстракции и проектирование

Как задать обязательный интерфейс абстрактным классом, создавать объекты альтернативными конструкторами и выбирать между наследованием и композицией.

  1. Абстрактные классыАбстрактный класс — наследник ABC с методами @abstractmethod: создать его нельзя, а подкласс обязан эти методы реализовать. TypeError при создании и шаблонный метод.20 мин
  2. Методы класса и статические методы@classmethod получает класс вместо экземпляра — так пишут альтернативные конструкторы: Product.from_line(...). @staticmethod — вспомогательная функция внутри класса.15 мин
  3. Композиция против наследования«Является» — наследование, «содержит» — композиция. Объект хранит другие объекты и делегирует им работу; почему class Menu(list) — плохая идея и как заменить части объекта на ходу.20 мин
  4. мини-проектМини-проект: оплатаАбстрактный PaymentMethod и три способа оплаты — наличные, карта и баллы. Заказ содержит способ оплаты (композиция), создаётся из строки методом класса, а касса проводит день оплат.25 мин
После модуля вы умеете
  • задать обязательный интерфейс через абстрактный класс: ABC, @abstractmethod
  • писать альтернативные конструкторы и вспомогательные методы: @classmethod, @staticmethod
  • выбирать между наследованием («является») и композицией («содержит»), делегировать работу вложенному объекту
Модуль 7

Контейнеры и операторы

Как сделать свой класс «как встроенный»: len, in, индексы, цикл for и арифметические операторы.

  1. Свой контейнер: __len__, __getitem__, __contains__Магические методы контейнера: len(), bool() и if, квадратные скобки и in работают с вашим объектом так же, как со списком или словарём.20 мин
  2. Объект в цикле for: __iter____iter__ с yield делает объект итерируемым: for, list(), sum() и генераторы списков работают с ним сами. Итерируемый объект против итератора и итератор на один проход.20 мин
  3. Операторы: __add__ и компанияПерегрузка операторов: __add__ и __mul__ задают + и * для своего класса, __radd__ и __rmul__ — операции, где ваш объект справа (и sum). Неизменяемые объекты: оператор возвращает новый объект.20 мин
  4. мини-проектМини-проект: складКласс Stock ведёт остатки «Кофейной лавки» как встроенный контейнер: len, in, цикл по позициям, stock["Молоко"] и сложение поставок плюсом.25 мин
После модуля вы умеете
  • научить свой объект работать с len, in, bool и квадратными скобками: __len__, __contains__, __bool__, __getitem__
  • пройти свой объект циклом for: __iter__ и yield, отличить итерируемый объект от итератора
  • задать операторы + и * для своего класса: __add__, __mul__, __radd__
Модуль 8

dataclasses и исключения

Классы данных без лишнего кода: @dataclass, проверки в __post_init__, неизменяемые объекты — и своя иерархия исключений для ошибок программы.

  1. dataclassesДекоратор @dataclass пишет __init__, __repr__ и __eq__ за вас по списку полей с аннотациями. Значения по умолчанию и field(default_factory=list) для списков.20 мин
  2. Настройки dataclass__post_init__ проверяет поля после __init__, frozen=True делает экземпляры неизменяемыми и хешируемыми, order=True — сравнимыми, а replace создаёт изменённую копию.20 мин
  3. Свои исключенияИсключение — тоже класс: своя иерархия ShopError → OutOfStockError, атрибуты исключения с подробностями, перехват по базовому классу и цепочка raise … from.25 мин
  4. мини-проектМини-проект: заказ с проверкамиOrderLine и Order на dataclass, проверки в __post_init__, своя иерархия исключений, разбор строк заказа с raise … from и касса, которая перехватывает ошибки и пишет понятный отчёт.25 мин
После модуля вы умеете
  • описывать данные dataclass'ами: аннотации полей, значения по умолчанию, field(default_factory=list)
  • настраивать dataclass: __post_init__, frozen=True, order=True, replace
  • строить свою иерархию исключений с атрибутами и перехватывать её: raise … from
Модуль 9

Итоговый проект «Касса кофейни»

Вся касса «Кофейной лавки» из классов курса: каталог и корзина, скидки, оплата, чек и отчёт за день. И что изучать дальше.

  1. мини-проектИтоговый проект: каталог и корзинаПервая часть кассы «Кофейной лавки»: свои исключения, товар-dataclass, каталог-контейнер, загрузка каталога из строк и корзина, которая берёт товары из каталога.30 мин
  2. мини-проектИтоговый проект: скидки, оплата и чекВторая часть кассы: скидки и оплата — иерархии с абстрактным классом, чек — dataclass со __str__, касса содержит скидки, выбирает лучшую и ведёт отчёт за день. И что изучать дальше.30 мин
После модуля вы умеете
  • спроектировать программу из нескольких классов: данные — dataclass, контейнеры — магические методы, варианты поведения — иерархия с абстрактным классом, части — композиция
  • обрабатывать ошибки программы своей иерархией исключений
  • знать, куда расти дальше: аннотации и typing.Protocol, __slots__, паттерны проектирования, тесты, классы библиотек