Программирование на Python: основы и практика

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

1. Введение в Python и настройка среды разработки

Введение в Python и настройка среды разработки

Что такое Python

Python — это язык программирования, на котором пишут программы: от небольших скриптов для автоматизации до веб-сервисов и анализа данных. Он популярен в обучении, потому что код читается почти как обычный текст, а для старта не нужно настраивать сложную инфраструктуру.

> Readability counts. PEP 20 – The Zen of Python

Где используется Python

| Область | Примеры задач | Примеры инструментов на Python | |---|---|---| | Автоматизация | обработка файлов, отчёты, переименование папок | os, pathlib, csv | | Веб-разработка | сайты, API для приложений | Django, Flask | | Анализ данных | таблицы, графики, расчёты | pandas, NumPy | | Тестирование | автотесты для приложений | pytest | | Машинное обучение | модели, классификация, рекомендации | scikit-learn |

Как мы будем работать в курсе

В курсе вы будете:

  • писать код в редакторе
  • запускать программы в терминале
  • устанавливать библиотеки через pip
  • работать в виртуальном окружении (изолированной среде проекта)
  • !Схема того, как редактор, терминал и папка проекта работают вместе

    Что нужно установить

    Для комфортной работы достаточно трёх вещей:

  • Python 3 (сам интерпретатор языка)
  • редактор кода или IDE (чтобы удобно писать код)
  • терминал (обычно уже есть в системе)
  • Интерпретатор — это программа, которая читает ваш файл с кодом и выполняет команды.

    Установка Python

    Установка на Windows

  • Откройте страницу загрузки Python: Python Downloads.
  • Скачайте установщик для Windows (кнопка будет предложена автоматически).
  • Запустите установщик и обязательно отметьте галочку Add Python to PATH.
  • Нажмите Install.
  • Перезапустите терминал (если он был открыт), чтобы система увидела новые команды.
  • PATH — это список папок, где операционная система ищет команды вроде python.

    Установка на macOS

  • Откройте страницу загрузки Python: Python Downloads.
  • Скачайте установщик для macOS.
  • Установите Python, следуя шагам мастера.
  • Откройте Terminal и проверьте версию (см. раздел ниже).
  • Если в системе есть несколько версий Python, команда может называться python3.

    Установка на Linux

    На многих дистрибутивах Python уже установлен. Если нет, его обычно устанавливают через менеджер пакетов.

  • Откройте терминал.
  • Попробуйте команду проверки версии (см. ниже).
  • Если команды нет, установите пакет Python 3 через менеджер пакетов вашего дистрибутива.
  • Рекомендация: в Linux команды часто называются python3 и pip3.

    Проверка установки

    Откройте терминал и выполните одну из команд:

    Если команда не найдена, попробуйте:

    Ожидаемый результат — строка вида Python 3.x.x.

    Быстрая шпаргалка команд

    | Задача | Команда | |---|---| | Проверить версию Python | python --version или python3 --version | | Запустить интерактивный режим | python или python3 | | Выйти из интерактивного режима | exit() |

    Выбор редактора: VS Code или PyCharm

    VS Code

    VS Code — лёгкий и популярный редактор, который становится очень удобным для Python после установки расширения.

  • Установите VS Code: Visual Studio Code.
  • Откройте расширения и установите Python от Microsoft.
  • PyCharm

    PyCharm — полноценная IDE (с множеством функций “из коробки”).

  • Скачайте PyCharm Community: PyCharm
  • IDE — это программа, которая объединяет редактор, запуск, отладку и управление проектом в одном месте.

    Терминал: что это и зачем

    Терминал — это окно, где вы запускаете команды. Для Python это нужно, чтобы:

  • запускать ваши .py файлы
  • создавать виртуальные окружения
  • устанавливать библиотеки
  • Если вы на Windows, можно использовать PowerShell или Windows Terminal.

    Виртуальное окружение и установка библиотек

    Что такое библиотека и pip

    Библиотека — это готовый код, который вы подключаете к своему проекту, чтобы не писать всё с нуля.

    pip — стандартный инструмент для установки библиотек.

    Проверка, что pip доступен:

    Если не работает, иногда помогает:

    Что такое виртуальное окружение

    Виртуальное окружение — это отдельный набор библиотек для конкретного проекта. Оно нужно, чтобы:

  • проекты не мешали друг другу версиями библиотек
  • было проще повторить настройку на другом компьютере
  • Создание виртуального окружения (рекомендуемый способ)

  • Создайте папку проекта и перейдите в неё:
  • Создайте виртуальное окружение:
  • Активируйте окружение:
  • После активации в начале строки терминала обычно появляется пометка вроде (.venv).

  • Установите библиотеку (пример):
  • Посмотрите список установленных библиотек:
  • Первый запуск Python

    Интерактивный режим (REPL)

    Запустите:

    Попробуйте выполнить команду:

    Чтобы выйти:

    Запуск файла .py

  • В папке проекта создайте файл hello.py со строкой:
  • Запустите файл из терминала:
  • Если у вас работает команда python3, используйте:

    Минимальная структура учебного проекта

    Обычно удобно начинать так:

  • my_project/ — папка проекта
  • my_project/.venv/ — виртуальное окружение
  • my_project/hello.py — ваш код
  • Позже мы добавим файлы и папки для более крупных программ.

    Типичные проблемы и решения

    Команда python не найдена

    Возможные причины:

  • Python не установлен
  • при установке не добавили Python в PATH
  • в системе используется команда python3
  • Что сделать:

  • Проверьте python3 --version.
  • На Windows переустановите Python и отметьте Add Python to PATH.
  • pip не работает

    Попробуйте запуск через Python:

    Не активируется виртуальное окружение в PowerShell

    Иногда PowerShell запрещает запуск скриптов активации. В таком случае стоит открыть PowerShell от имени пользователя и разрешить выполнение скриптов для текущего пользователя, следуя официальной документации Microsoft по Execution Policy.

    Что дальше

    В следующей статье мы начнём писать первые программы и разберём базовые элементы языка: переменные, типы данных и ввод-вывод. Важно, чтобы к этому моменту у вас уже запускались команды python (или python3) и работало виртуальное окружение.

    2. Типы данных, операторы и управляющие конструкции

    Типы данных, операторы и управляющие конструкции

    В прошлой статье вы установили Python, научились запускать код в терминале и создавать проект с виртуальным окружением. Теперь перейдём к самому языку: разберём, какие бывают типы данных, как выполнять вычисления и как управлять тем, что делает программа.

    Переменные и присваивание

    Переменная — это имя, под которым в программе хранится значение.

    Правила, которые полезно запомнить:

  • Имя переменной чувствительно к регистру: age и Age — разные имена.
  • В имени можно использовать буквы, цифры и _, но имя не может начинаться с цифры.
  • Лучше выбирать понятные имена: total_price лучше, чем tp.
  • Чтобы посмотреть тип значения, используйте type():

    Базовые типы данных

    Числа: int и float

  • int — целые числа, например -3, 0, 42.
  • float — числа с дробной частью, например 3.14, 0.5.
  • Логический тип: bool

    bool имеет два значения:

  • True
  • False
  • Чаще всего получается из сравнений:

    Строки: str

    Строка — это текст.

    Частые операции со строками:

    | Задача | Пример | Результат | |---|---|---| | Склеить строки | "Py" + "thon" | "Python" | | Повторить строку | "ha" * 3 | "hahaha" | | Длина строки | len("abc") | 3 |

    Важно: + для строк — это соединение, а не сложение.

    None

    None означает нет значения.

    Это полезно, когда значение появится позже или его может не быть.

    Коллекции: несколько значений в одной переменной

    Списки: list

    Список хранит элементы по порядку и позволяет менять их.

    Кортежи: tuple

    Кортеж похож на список, но его обычно не меняют.

    Словари: dict

    Словарь хранит пары ключ → значение.

    Множества: set

    Множество хранит уникальные элементы (без повторов).

    Преобразование типов

    Иногда нужно превратить одно значение в другое, например строку из input() в число.

    Полезные функции:

    | Преобразование | Пример | Что получится | |---|---|---| | в целое число | int("42") | 42 | | в число с дробной частью | float("3.5") | 3.5 | | в строку | str(10) | "10" | | в логическое | bool(0) | False |

    Важно: int("3.5") вызовет ошибку, потому что строка "3.5" не является целым числом.

    Ввод и вывод: input() и print()

    print() выводит текст в терминал.

    input() читает строку, которую ввёл пользователь.

    Если нужно число, делайте преобразование:

    Операторы

    Арифметические операторы

    | Оператор | Значение | Пример | Результат | |---|---|---|---| | + | сложение | 2 + 3 | 5 | | - | вычитание | 5 - 2 | 3 | | | умножение | 4 3 | 12 | | / | деление | 7 / 2 | 3.5 | | // | целочисленное деление | 7 // 2 | 3 | | % | остаток от деления | 7 % 2 | 1 | | | степень | 2 3 | 8 |

    Пример, где удобен %:

    Операторы сравнения

    Операторы сравнения дают результат типа bool.

    | Оператор | Смысл | Пример | |---|---|---| | == | равно | x == 10 | | != | не равно | x != 10 | | < | меньше | x < 10 | | <= | меньше или равно | x <= 10 | | > | больше | x > 10 | | >= | больше или равно | x >= 10 |

    Логические операторы: and, or, not

  • andи: истина, если истинны оба условия.
  • orили: истина, если истинно хотя бы одно.
  • notне: меняет True на False и наоборот.
  • Управляющие конструкции

    Управляющие конструкции — это команды, которые позволяют программе ветвиться и повторять действия.

    !Простая схема работы условия if/else

    Условие: if, elif, else

    if выполняет блок кода, если условие истинно.

    Как это читать:

  • Если temperature < 0, выполняется первый блок.
  • Иначе, если temperature < 15, выполняется второй блок.
  • Иначе выполняется else.
  • Важно про отступы:

  • Блоки кода в Python задаются отступами.
  • Обычно используют 4 пробела.
  • Цикл while

    while повторяет действия, пока условие истинно.

    Полезные команды внутри циклов:

  • break — выйти из цикла сразу.
  • continue — перейти к следующему повтору.
  • Цикл for и range()

    for удобен, когда нужно пройтись по последовательности.

    Пример с range():

    Здесь range(5) создаёт последовательность чисел 0, 1, 2, 3, 4.

    Пример прохода по списку:

    Практика: небольшая программа целиком

    Программа считает сумму покупок и применяет скидку, если сумма достаточно большая.

    Что здесь используется:

  • float() для цен с дробной частью
  • цикл for для повторения ввода
  • if для скидки
  • арифметика += и *=
  • Частые ошибки новичков

    Строка вместо числа

    input() всегда возвращает str.

    Путаница == и =

  • = присваивает значение
  • == сравнивает значения
  • Неправильные отступы

    Если отступы разные или их нет, Python не поймёт границы блока.

    Что дальше

    В следующей статье вы научитесь оформлять код в функции, чтобы делать программы понятнее и переиспользовать логику без копирования.

    Полезная справка по базовым типам и операциям есть в официальной документации Python: Built-in Types

    3. Функции, модули и работа с библиотеками

    Функции, модули и работа с библиотеками

    В прошлой статье вы познакомились с типами данных, операторами, условиями и циклами. Теперь сделаем следующий шаг: научимся организовывать код так, чтобы он был понятным, повторно используемым и удобным для развития.

    Для этого в Python используют:

  • функции (чтобы не копировать один и тот же код)
  • модули (чтобы разделять программу на файлы)
  • библиотеки (чтобы подключать готовые решения через pip)
  • Зачем нужны функции

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

    Функция — это именованный блок кода, который можно вызывать много раз.

    Как объявлять и вызывать функции

    Функция объявляется с помощью def.

    Здесь:

  • greet — имя функции
  • nameпараметр (переменная внутри функции)
  • "Аня" и "Борис"аргументы (конкретные значения при вызове)
  • Возврат значения: return

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

    Важно:

  • return завершает выполнение функции
  • если return не указан, функция возвращает None
  • Пример функции, которая ничего не возвращает явно:

    Несколько return

    Так часто делают, когда есть разные случаи.

    Область видимости переменных

    Область видимости — это правило, где «видна» переменная.

  • переменные внутри функции обычно доступны только внутри функции
  • переменные снаружи функции доступны в основном коде
  • Такое поведение полезно: функции не «ломают» случайно данные в других частях программы.

    Параметры по умолчанию

    Можно задать значение параметра, которое используется, если аргумент не передали.

    Практическое правило:

  • параметры по умолчанию обычно ставят в конце списка параметров
  • Именованные аргументы

    При вызове функции можно явно указать, какой параметр вы заполняете.

    Это помогает читать код и уменьшает ошибки при большом количестве параметров.

    Мини-договор функции: что она принимает и что возвращает

    Чтобы функция была удобной, полезно мысленно формулировать «договор»:

  • что функция принимает (типы и смысл параметров)
  • что функция возвращает (что означает результат)
  • Обычно это записывают в виде докстроки — текста в начале функции.

    Модули

    Модуль — это обычный файл .py, который можно подключить в другой файл.

    Зачем нужны модули:

  • чтобы держать код в порядке (разбивать на части)
  • чтобы переиспользовать функции в нескольких местах
  • !Схема того, как один файл Python импортирует функции из другого файла

    Пример: свой модуль в проекте

    Структура:

  • main.py
  • utils.py
  • utils.py:

    main.py:

    Здесь utils.is_even означает: взять функцию is_even из модуля utils.

    Варианты импорта

    | Как импортировать | Пример | Когда удобно | |---|---|---| | импортировать модуль целиком | import utils | когда функций много и важно видеть, откуда они | | импортировать конкретное имя | from utils import is_even | когда нужна 1–2 функции | | импортировать с псевдонимом | import utils as u | когда имя длинное |

    Пример from ... import ...:

    Важно: если у вас есть файл random.py в проекте, он может «перекрыть» стандартный модуль random. Поэтому лучше не называть свои файлы как популярные библиотеки.

    Официальная справка по модулям: The Python Tutorial: Modules

    Стандартная библиотека Python

    Python поставляется с большим набором готовых модулей. Это называется стандартная библиотека.

    Примеры полезных модулей:

  • math — математические функции
  • random — случайные числа
  • datetime — дата и время
  • pathlib — работа с путями и файлами
  • Пример с math:

    Список модулей стандартной библиотеки: Python Standard Library

    Внешние библиотеки и pip

    Внешняя библиотека — это пакет, который не входит в стандартную поставку Python. Его устанавливают отдельно.

    pip — стандартная утилита для установки таких пакетов.

    Установка пакета:

    После этого в коде можно писать:

    Документация pip: pip documentation

    Почему важно виртуальное окружение

    В прошлой статье вы создавали виртуальное окружение через python -m venv .venv. Напоминание, зачем это нужно:

  • у каждого проекта свои зависимости (библиотеки и их версии)
  • проекты не мешают друг другу
  • проще повторить настройку на другом компьютере
  • Документация venv: venv — Creation of virtual environments

    Как сохранять зависимости проекта

    Чтобы зафиксировать список установленных библиотек, используют файл requirements.txt.

    Сгенерировать список зависимостей:

    Установить зависимости из файла (например, на другом компьютере):

    Практическое правило:

  • виртуальное окружение хранит библиотеки
  • requirements.txt хранит список того, что нужно установить
  • Небольшая программа целиком: разбиваем на функции и модули

    Сделаем мини-приложение, которое считает итоговую сумму корзины и применяет скидку.

    pricing.py:

    main.py:

    Что важно заметить:

  • основной сценарий лежит в main.py
  • расчёты вынесены в pricing.py
  • функции можно тестировать и переиспользовать отдельно
  • Частые ошибки новичков

    Забыли вызвать функцию

    Перепутали print и return

  • print() показывает текст пользователю
  • return отдаёт значение обратно в программу
  • Если функция должна «что-то посчитать», чаще всего нужен return, а печатать результат лучше снаружи.

    Импорт не работает из-за структуры проекта

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

  • запускайте программу из папки проекта
  • держите связанные .py файлы рядом
  • Что дальше

    Теперь вы умеете оформлять логику в функции, разделять программу на модули и подключать внешние библиотеки через pip. В следующих темах это станет основой для более крупных программ: мы будем работать со структурами проекта, обработкой ошибок и более сложными сценариями.

    4. Работа с файлами и обработка исключений

    Работа с файлами и обработка исключений

    После тем про типы данных, управляющие конструкции и функции вы уже умеете писать небольшие программы. Следующий шаг к практическим задачам: научиться сохранять данные между запусками (файлы) и делать программы устойчивыми к ошибкам (исключения).

    > Errors should never pass silently. PEP 20 — The Zen of Python

    Зачем нужны файлы

    Файлы помогают, когда:

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

    Пути и где лежит файл

    Путь — это адрес файла в системе.

    В учебных проектах проще всего начинать с правила:

  • кладите файлы данных рядом с main.py
  • запускайте программу из папки проекта
  • Для работы с путями удобно использовать модуль pathlib.

    Плюсы pathlib:

  • одинаково работает на Windows, macOS и Linux
  • удобно склеивает части пути через /
  • Открытие файла: open() и режимы

    Открытие файла выглядит так:

    Параметры:

  • первый аргумент: путь к файлу
  • второй аргумент: режим
  • encoding="utf-8": кодировка текста
  • Основные режимы

    | Режим | Смысл | Если файла нет | Что происходит с содержимым | |---|---|---|---| | "r" | чтение | ошибка | не меняется | | "w" | запись | создастся | перезапишется полностью | | "a" | дозапись в конец | создастся | добавление в конец | | "rb" | чтение байтов | ошибка | не меняется | | "wb" | запись байтов | создастся | перезапишется полностью |

    Важно: режим "w" удаляет старое содержимое файла. Если нужно добавлять, используйте "a".

    Контекстный менеджер: with

    Файл нужно закрывать. Самый безопасный способ — with: он закроет файл даже если внутри случится ошибка.

    !Как устроен безопасный цикл работы с файлом через with

    Пример чтения:

    Что здесь важно:

  • as f создаёт переменную, через которую мы работаем с файлом
  • после выхода из блока with файл закрывается автоматически
  • Чтение текстовых файлов

    Прочитать весь файл: read()

    Подходит для небольших файлов.

    Прочитать построчно

    Вариант 1: readline() и цикл while.

    Вариант 2: пройти по файлу циклом for.

    strip() убирает пробелы и символ перевода строки \n по краям.

    Запись текстовых файлов

    Записать строку: write()

    Записать много строк: writelines()

    Важно: writelines() не добавляет \n автоматически, их нужно включить в строки.

    Кодировки и типичная проблема с текстом

    Если вы видите кракозябры или получаете ошибку декодирования, почти всегда проблема в кодировке.

    Практическое правило для учебных задач:

  • при работе с русским текстом используйте encoding="utf-8"
  • Работа с файлами через pathlib

    pathlib умеет не только собирать пути, но и читать или писать текст.

    Это удобно для небольших сценариев.

    Документация: pathlib — Object-oriented filesystem paths

    Полезные форматы: CSV и JSON

    В реальных задачах данные часто лежат не в произвольном тексте.

    CSV: таблицы

    CSV удобно использовать для простых таблиц. В Python есть стандартный модуль csv.

    Запись:

    Чтение:

    newline="" при записи помогает избежать лишних пустых строк на Windows.

    Документация: csv — CSV File Reading and Writing

    JSON: структуры данных

    JSON удобно хранит словари и списки. В Python есть стандартный модуль json.

    Запись словаря в файл:

    Чтение обратно:

    ensure_ascii=False позволяет сохранить русские буквы как есть.

    Документация: json — JSON encoder and decoder

    Что такое исключения

    Исключение — это сигнал Python о том, что произошла ошибка, и обычное выполнение кода прерывается.

    Примеры типичных исключений:

  • FileNotFoundError: файл не найден
  • PermissionError: нет прав на чтение или запись
  • ValueError: не получилось преобразовать значение, например int("abc")
  • ZeroDivisionError: деление на ноль
  • Если исключение не обработать, программа завершится и покажет трассировку.

    Обработка исключений: try/except/else/finally

    Базовый шаблон:

    !Как работает try/except/else/finally

    Несколько except

    Правило: обрабатывайте ожидаемые ошибки, а не все подряд.

    else

    else выполняется, если ошибок не было.

    finally

    finally выполняется всегда, даже если произошла ошибка. Там удобно освобождать ресурсы.

    На практике чаще используют with, чтобы не писать finally для файлов.

    Документация: Errors and Exceptions

    Когда полезно выбрасывать исключения самому: raise

    Иногда вы пишете функцию и хотите явно запретить неправильные входные данные.

    Это делает ошибки понятными и помогает быстрее найти проблему.

    Практический пример: читаем числа из файла и считаем сумму

    Задача: в файле numbers.txt лежат числа по одному в строке. Нужно посчитать сумму, пропуская пустые строки, и вывести понятные сообщения об ошибках.

    Что здесь используется из предыдущих тем:

  • функции, чтобы оформить логику и переиспользовать её
  • циклы и условия для обработки строк
  • преобразование типов float()
  • модуль pathlib для пути
  • обработка исключений для устойчивого поведения
  • Типичные ошибки новичков

    Забыли про encoding

    Если текст на русском, а вы не указали кодировку, на некоторых системах чтение может сломаться. Привычка encoding="utf-8" экономит время.

    Использовали except Exception без причины

    Так можно случайно спрятать настоящую проблему. Лучше ловить конкретные исключения, которые вы ожидаете.

    Открыли файл в "w" и потеряли данные

    Если нужно добавить строки в конец, используйте "a".

    Что дальше

    Теперь вы умеете:

  • читать и записывать файлы безопасно через with
  • работать с путями через pathlib
  • использовать базовые форматы CSV и JSON
  • обрабатывать ошибки через try/except
  • В следующих материалах эти навыки будут постоянно применяться: для конфигураций, логов, хранения результатов и построения более крупных программ.

    5. Основы ООП: классы, объекты и наследование

    Основы ООП: классы, объекты и наследование

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

    Объектно-ориентированное программирование (ООП) помогает организовывать код вокруг сущностей предметной области: пользователь, заказ, файл отчёта, банковский счёт, корзина товаров.

    Что такое ООП простыми словами

    В ООП программа состоит из объектов.

  • Объект хранит данные (состояние) и умеет выполнять действия (поведение).
  • Класс — это чертёж (шаблон), по которому создаются объекты.
  • Пример из жизни:

  • класс: Car
  • объект: конкретная машина car1
  • данные: цвет, скорость
  • действия: ехать, тормозить
  • !Диаграмма показывает, что класс является шаблоном, а объекты — конкретными экземплярами с разными данными

    Класс и объект в Python

    Как объявить класс

    Класс объявляется ключевым словом class. По соглашению имена классов пишут в стиле CamelCase.

    Создание объекта (экземпляра класса):

    User — это класс, u — объект этого класса.

    Атрибуты объекта

    Атрибут — это значение, которое хранится внутри объекта.

    Так можно делать, но чаще атрибуты задают внутри специального метода __init__.

    Метод __init__ и роль self

    Зачем нужен __init__

    __init__ — это метод, который вызывается при создании объекта. Обычно в нём задают начальное состояние.

    Что такое self

    self — это ссылка на текущий объект.

  • когда вы пишете u = User("Аня", 20), Python создаёт объект и вызывает __init__
  • внутри __init__ параметр self указывает на тот самый созданный объект
  • self.name = name означает сохранить имя в объект
  • Практическое правило:

  • self пишется первым параметром в методах экземпляра
  • при вызове u.some_method() передавать self вручную не нужно
  • Методы: поведение объекта

    Метод — это функция внутри класса, которая работает с данными объекта через self.

    Здесь:

  • value — состояние
  • inc() и reset() — действия
  • Атрибуты класса и атрибуты объекта

    В Python есть два распространённых вида атрибутов.

    | Вид | Где хранится | Общий для всех объектов | Пример | |---|---|---|---| | Атрибут объекта | в конкретном объекте | нет | self.name | | Атрибут класса | в самом классе | да | User.role |

    Пример:

    Важно: если присвоить u1.role = "x", то вы создадите атрибут объекта, который «перекроет» атрибут класса только для u1.

    Мини-проект: банковский счёт

    Сделаем класс, который хранит баланс и умеет пополняться и списывать деньги. Ошибки будем оформлять через исключения из предыдущей статьи.

    Что здесь важно:

  • состояние объекта: owner, balance
  • поведение: deposit(), withdraw()
  • защита от неправильных данных через raise ValueError(...)
  • Инкапсуляция: прячем детали, оставляем интерфейс

    Инкапсуляция означает: пользователю класса проще работать, если он использует методы, а не «лезет» в состояние напрямую.

    Например, вместо того чтобы делать acc.balance -= 999, лучше всегда вызывать withdraw(), потому что там уже есть проверки.

    Про подчёркивания в Python

    В Python нет жёсткого запрета на доступ к «внутренним» атрибутам, но есть соглашения:

  • balance — публичный атрибут, его можно читать и менять
  • _balanceвнутренний атрибут: лучше не трогать снаружи
  • __balance — имя будет изменено механизмом name mangling, это усложняет доступ снаружи, но не делает его невозможным
  • Для учебных проектов чаще всего достаточно правила: не меняйте внутреннее состояние напрямую, если для этого есть метод.

    Наследование: расширяем и переиспользуем

    Наследование позволяет создать новый класс на основе существующего.

  • родительский класс (базовый): то, от чего наследуемся
  • дочерний класс (производный): то, что наследуется и расширяет поведение
  • !Схема показывает, что дочерние классы наследуют поля и методы базового и могут добавлять или переопределять поведение

    Пример наследования

    Сделаем накопительный счёт, который умеет начислять проценты.

    Что здесь происходит:

  • class SavingsAccount(BankAccount) означает, что SavingsAccount наследует deposit() и withdraw()
  • super().__init__(...) вызывает конструктор родительского класса, чтобы не дублировать код
  • добавлен новый атрибут interest_rate и новый метод add_interest()
  • Переопределение методов

    Дочерний класс может переопределить метод родителя: оставить имя тем же, но изменить поведение.

    Например, кредитный счёт может разрешать уходить в минус до лимита.

    Здесь withdraw() работает иначе, чем в BankAccount, но интерфейс остался тем же: метод называется так же и принимает те же данные.

    Полиморфизм: один интерфейс, разные реализации

    Полиморфизм в практике означает: если у разных объектов есть методы с одинаковыми именами и смыслом, то код может работать с ними одинаково.

    Пример: функция, которая пытается снять деньги, не зная, какой это счёт.

    Функции pay() не важно, экземпляр какого класса ей передали. Важно, что у объекта есть метод withdraw() с ожидаемым смыслом.

    Когда ООП действительно полезно

    ООП особенно удобно, когда:

  • в программе есть сущности с состоянием и поведением
  • нужно хранить данные и правила работы с ними вместе
  • появляются «варианты» одной сущности (например, разные типы аккаунтов)
  • Если задача маленькая, не нужно заставлять себя писать классы. Функции и словари из прошлых тем часто проще.

    Частые ошибки новичков

    Путают класс и объект

    Забывают self

    Правильно:

    Используют изменяемые значения как параметры по умолчанию

    Это важная тема, особенно в ООП.

    Плохо:

    Правильно:

    Полезные источники

  • Документация Python: Классы
  • Документация Python: Модель данных
  • Что дальше

    Теперь вы умеете:

  • создавать классы и объекты
  • хранить состояние в атрибутах и описывать поведение методами
  • использовать __init__, self и super()
  • применять наследование и переопределение
  • писать код, который работает с разными объектами через общий интерфейс
  • Следующий практический шаг обычно связан с тем, как проектировать классы аккуратно: композиция (объекты внутри объектов), работа с несколькими модулями, и постепенное усложнение структуры проекта без хаоса.