Курсы / ООП в Python Курс с нуля
ООП в Python Классы и объекты с нуля: от первого класса до программы из нескольких классов — свойства, магические методы, наследование, абстрактные классы, dataclass и свои исключения — на сквозном примере кассы кофейни.
9 модулей 35 уроков ≈ 12 ч
Начать курс Для кого Для тех, кто пишет на Python простые программы с функциями, списками и словарями, а классы видел только в чужом коде. После курса вы спроектируете небольшую программу из нескольких классов и будете уверенно читать классы библиотек.
Что нужно знать Базовый Python: переменные, списки, словари, циклы, функции с параметрами и return. Проверить себя — первый урок курса, «Python-минимум» . Курсы NumPy и pandas не нужны: в этом курсе только стандартный Python. Установка ничего не нужна: код выполняется прямо в браузере. Любой урок можно скачать как .ipynb и пройти в Jupyter или Google Colab (Python 3.10 и новее). Как устроены уроки Урок — это ноутбук: короткое объяснение, код, который можно выполнить и изменить, упражнения с проверкой и вопросы. Python работает прямо в браузере; урок можно скачать как .ipynb для Jupyter или Colab.
Программа Модуль 1 Первые классы Что такое объект и класс, как объявить свой класс, заполнить экземпляр в __init__ и научить его методам.
Python-минимумСамопроверка перед курсом — словари, циклы, генераторы списков, функции и try/except. Если всё решается легко, вы готовы. 15 мин Всё в Python — объектУ каждого значения есть тип — класс, который определяет, что значение умеет. type, isinstance и методы строк и списков как поведение объекта. 15 мин Первый классОбъявить свой класс словом class, создать экземпляры вызовом класса и записать в них атрибуты — и понять, почему записывать атрибуты снаружи неудобно. 15 мин __init__ и selfМетод __init__ заполняет атрибуты нового экземпляра сразу при создании, а self — это сам этот экземпляр. Параметры, значения по умолчанию и забытый self. 20 мин МетодыМетод — функция внутри класса, которая работает с данными своего экземпляра. Метод, который возвращает результат, и метод, который меняет атрибуты; забытый self и вызов без скобок. 20 мин мини-проект Мини-проект: ценникКласс Product для меню «Кофейной лавки»: цена за 100 мл, цена со скидкой и строка ценника, каталог из экземпляров и самый выгодный напиток. 20 мин После модуля вы умеете объяснить, что такое объект, класс и экземпляр, и узнать тип значения: type, isinstance объявить класс с __init__ и методами создать несколько экземпляров и работать с их атрибутами объяснить, что такое self и почему его нужно писать Атрибуты класса и экземпляраАтрибут класса общий для всех экземпляров, атрибут экземпляра — у каждого свой. Константы класса, порядок поиска атрибута и список в атрибуте класса, который делят все. 20 мин Объекты в списках и ссылкиПеременная не хранит объект, а ссылается на него. Две переменные — один объект, оператор is, изменение через ссылку, объекты в списках и изменяемое значение по умолчанию. 20 мин мини-проект Мини-проект: корзинаКласс Cart хранит товары в списке: добавить, убрать, посчитать сумму, найти самый дорогой. Две независимые корзины и товар, который лежит в обеих. 20 мин После модуля вы умеете отличить атрибут класса от атрибута экземпляра и объяснить, где Python ищет атрибут понять, когда две переменные ссылаются на один объект: is и == хранить объекты внутри объекта — корзина с товарами избегать общих изменяемых данных: список в атрибуте класса и изменяемое значение по умолчанию Что трогать снаружи: _ и __Публичный интерфейс класса и внутренние атрибуты с подчёркиванием. Изменение состояния через методы с проверками и искажение имён у __x. 15 мин СвойстваДекоратор @property превращает метод в атрибут, который читается без скобок, — вычисляемый и только для чтения. Когда писать свойство, а когда метод. 15 мин Сеттер и проверка значений@x.setter разрешает запись в свойство и проверяет значение: неверное — raise ValueError. Проверка в __init__ через свойство и рекурсия в сеттере. 20 мин мини-проект Мини-проект: карта лояльностиКласс LoyaltyCard: баллы только для чтения, начисление и списание с проверками, уровень карты — вычисляемое свойство. Покупки нескольких клиентов и золотые карты. 25 мин После модуля вы умеете отделить публичный интерфейс класса от внутренних атрибутов: _x и __x сделать вычисляемый атрибут и атрибут только для чтения: @property проверять значения в сеттере и выбрасывать ValueError выбирать между методом и свойством Модуль 4 Представление и сравнение Магические методы, которые делают объекты удобными: понятный вывод при отладке, равенство, сортировка и место в set и dict.
Как объект выглядит: __repr__ и __str__Магические методы — способ встроить свой класс в язык. __repr__ — представление для отладки, __str__ — для людей, repr() и !r в f-строках. 15 мин Равенство: __eq____eq__ задаёт, когда два объекта равны по смыслу. == против is, NotImplemented для чужого типа, __hash__ — и почему объект пропал из set. 25 мин Сортировка объектов__lt__ учит объекты сравниваться на «меньше» — и начинают работать sorted, min и max. @total_ordering дописывает остальные сравнения, а key= сортирует без магических методов. 20 мин мини-проект Мини-проект: прайс-листДва прайса поставщика сводятся в один: товары с __repr__, __eq__ и __hash__, дубли убирает set, сортировка по цене и по названию, товары, у которых изменилась цена. 20 мин После модуля вы умеете задать представление объекта для отладки и для людей: __repr__ и __str__ сравнивать объекты по смыслу: __eq__, NotImplemented, __hash__ сортировать объекты и искать минимум и максимум: __lt__, @total_ordering, key= класть свои объекты в set и делать ключами dict Модуль 5 Наследование и полиморфизм Классы на основе других классов: что наследуется, как переопределить и расширить метод, и как писать код, которому неважен конкретный класс.
Наследованиеclass B(A): подкласс получает атрибуты и методы базового класса, может добавить свои и переопределить чужие. isinstance и issubclass в иерархии и проверки не в том порядке. 20 мин super()super() вызывает метод базового класса из подкласса: свой __init__ с дополнительными атрибутами, расширение метода вместо копирования, порядок поиска методов MRO и забытый super().__init__. 20 мин Полиморфизм и утиная типизацияОдин и тот же вызов — разное поведение у разных классов. Функция, которой неважен класс объекта, утиная типизация и новый класс, который встраивается в готовый код. 20 мин мини-проект Мини-проект: скидкиИерархия скидок: базовый Discount и подклассы PercentDiscount, FixedDiscount и BuyNGetOne. Касса применяет любую скидку одним вызовом и выбирает самую выгодную. 25 мин После модуля вы умеете строить небольшие иерархии классов: class B(A), переопределение методов, isinstance и issubclass расширять поведение базового класса через super() писать код, которому неважен конкретный класс: полиморфизм и утиная типизация Абстрактные классыАбстрактный класс — наследник ABC с методами @abstractmethod: создать его нельзя, а подкласс обязан эти методы реализовать. TypeError при создании и шаблонный метод. 20 мин Методы класса и статические методы@classmethod получает класс вместо экземпляра — так пишут альтернативные конструкторы: Product.from_line(...). @staticmethod — вспомогательная функция внутри класса. 15 мин Композиция против наследования«Является» — наследование, «содержит» — композиция. Объект хранит другие объекты и делегирует им работу; почему class Menu(list) — плохая идея и как заменить части объекта на ходу. 20 мин мини-проект Мини-проект: оплатаАбстрактный PaymentMethod и три способа оплаты — наличные, карта и баллы. Заказ содержит способ оплаты (композиция), создаётся из строки методом класса, а касса проводит день оплат. 25 мин После модуля вы умеете задать обязательный интерфейс через абстрактный класс: ABC, @abstractmethod писать альтернативные конструкторы и вспомогательные методы: @classmethod, @staticmethod выбирать между наследованием («является») и композицией («содержит»), делегировать работу вложенному объекту Модуль 7 Контейнеры и операторы Как сделать свой класс «как встроенный»: len, in, индексы, цикл for и арифметические операторы.
Свой контейнер: __len__, __getitem__, __contains__Магические методы контейнера: len(), bool() и if, квадратные скобки и in работают с вашим объектом так же, как со списком или словарём. 20 мин Объект в цикле for: __iter____iter__ с yield делает объект итерируемым: for, list(), sum() и генераторы списков работают с ним сами. Итерируемый объект против итератора и итератор на один проход. 20 мин Операторы: __add__ и компанияПерегрузка операторов: __add__ и __mul__ задают + и * для своего класса, __radd__ и __rmul__ — операции, где ваш объект справа (и sum). Неизменяемые объекты: оператор возвращает новый объект. 20 мин мини-проект Мини-проект: складКласс Stock ведёт остатки «Кофейной лавки» как встроенный контейнер: len, in, цикл по позициям, stock["Молоко"] и сложение поставок плюсом. 25 мин После модуля вы умеете научить свой объект работать с len, in, bool и квадратными скобками: __len__, __contains__, __bool__, __getitem__ пройти свой объект циклом for: __iter__ и yield, отличить итерируемый объект от итератора задать операторы + и * для своего класса: __add__, __mul__, __radd__ Модуль 8 dataclasses и исключения Классы данных без лишнего кода: @dataclass, проверки в __post_init__, неизменяемые объекты — и своя иерархия исключений для ошибок программы.
dataclassesДекоратор @dataclass пишет __init__, __repr__ и __eq__ за вас по списку полей с аннотациями. Значения по умолчанию и field(default_factory=list) для списков. 20 мин Настройки dataclass__post_init__ проверяет поля после __init__, frozen=True делает экземпляры неизменяемыми и хешируемыми, order=True — сравнимыми, а replace создаёт изменённую копию. 20 мин Свои исключенияИсключение — тоже класс: своя иерархия ShopError → OutOfStockError, атрибуты исключения с подробностями, перехват по базовому классу и цепочка raise … from. 25 мин мини-проект Мини-проект: заказ с проверкамиOrderLine и Order на dataclass, проверки в __post_init__, своя иерархия исключений, разбор строк заказа с raise … from и касса, которая перехватывает ошибки и пишет понятный отчёт. 25 мин После модуля вы умеете описывать данные dataclass'ами: аннотации полей, значения по умолчанию, field(default_factory=list) настраивать dataclass: __post_init__, frozen=True, order=True, replace строить свою иерархию исключений с атрибутами и перехватывать её: raise … from Модуль 9 Итоговый проект «Касса кофейни» Вся касса «Кофейной лавки» из классов курса: каталог и корзина, скидки, оплата, чек и отчёт за день. И что изучать дальше.
мини-проект Итоговый проект: каталог и корзинаПервая часть кассы «Кофейной лавки»: свои исключения, товар-dataclass, каталог-контейнер, загрузка каталога из строк и корзина, которая берёт товары из каталога. 30 мин мини-проект Итоговый проект: скидки, оплата и чекВторая часть кассы: скидки и оплата — иерархии с абстрактным классом, чек — dataclass со __str__, касса содержит скидки, выбирает лучшую и ведёт отчёт за день. И что изучать дальше. 30 мин После модуля вы умеете спроектировать программу из нескольких классов: данные — dataclass, контейнеры — магические методы, варианты поведения — иерархия с абстрактным классом, части — композиция обрабатывать ошибки программы своей иерархией исключений знать, куда расти дальше: аннотации и typing.Protocol, __slots__, паттерны проектирования, тесты, классы библиотек