$ sudo teach IT
МОДУЛЬ 1 · УРОК 1

Что такое ООП и зачем оно вообще нужно?

Прежде чем писать первый класс, давайте разберёмся: откуда вообще взялось объектно-ориентированное программирование, какую проблему оно решает и почему весь современный Python-код пронизан этой идеей — от Django до игр.

⏱ ~20 минут 🎓 Для новичков 🐍 Python 3

🕰️ Как программировали до ООП

Чтобы понять, зачем появилось ООП, нужно сначала понять, как люди программировали до него. И это не просто история — это ключ к тому, почему ООП вообще существует.

Представьте, что на дворе 1960-е годы. Компьютеры — огромные шкафы стоимостью как небольшой завод. Программисты пишут на языке Fortran — первом высокоуровневом языке программирования. Программа выглядит как последовательность инструкций: сделай это, потом то, потом вот это. Всё линейно, сверху вниз.

Потом появился язык C (1972 год) — на нём написано ядро Linux, большинство операционных систем и тонны системного кода. В C уже есть функции — можно выделить кусок логики в отдельный блок и вызывать его из разных мест. Это был огромный прогресс!

💬 Проблема: данные и функции жили отдельно. Функция calculate_salary() ничего не знала о структуре employee — программист сам должен был следить, чтобы передавать правильные данные в правильные функции. При росте программы это превращалось в кошмар.

Представьте такую картину: у вас есть программа для банка. Данные о клиенте (имя, баланс, список транзакций) хранятся где-то в памяти. Функции для работы с ними (пополнить, снять, посмотреть историю) — совсем в другом месте. Между ними нет никакой жёсткой связи. Любой программист мог случайно передать баланс одного клиента в функцию, которая ожидала идентификатор другого. Программа могла часами работать неправильно, и никто бы не заметил.

Когда программы стали расти — тысячи строк, потом десятки тысяч — поддерживать такой код становилось всё сложнее. И тогда программисты задали себе вопрос: «А что если объединить данные и функции вместе?»

🌱 Рождение ООП: идея из реального мира

В конце 1960-х норвежские учёные Кристен Найгор и Оле-Йохан Даль создали язык Simula. Он был предназначен для… симуляций. Они хотели моделировать реальные процессы: движение кораблей, работу фабрики, поведение людей в очереди.

И вот тут пришла гениальная мысль: в реальном мире всё состоит из объектов. Корабль — это объект. У него есть характеристики (название, водоизмещение, скорость) и поведение (плыть, остановиться, загрузить груз). Почему бы не отразить это в коде?

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

Позже, в 1980-х, эту идею развил Алан Кей в языке Smalltalk — именно он придумал сам термин «объектно-ориентированное программирование». А в 1990-х ООП захватило мир: C++, Java, Python — все они построены вокруг этой концепции.

🚗 Аналогии из реальной жизни

Самый лучший способ понять ООП — посмотреть вокруг. Буквально всё вокруг нас — это объекты в смысле ООП.

🚗
Автомобиль

Данные: марка, цвет, скорость, уровень топлива
Поведение: заводиться, ехать, тормозить, заправляться

👤
Человек

Данные: имя, возраст, рост, профессия
Поведение: говорить, работать, отдыхать, учиться

🏦
Банковский счёт

Данные: номер счёта, баланс, история транзакций
Поведение: пополнить, снять, перевести, показать баланс

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

💡 Запомните: объект в программировании — это как объект в реальной жизни. У него есть атрибуты (данные — что он такое) и методы (поведение — что он умеет).

💡 Три ключевые идеи ООП простыми словами

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

🌍
Идея 1: Моделируем реальность в коде

Вместо того чтобы думать о программе как о потоке команд («сначала сделай это, потом то»), мы думаем о ней как о наборе сущностей, которые взаимодействуют друг с другом. Если пишем программу для интернет-магазина — у нас есть объекты «Товар», «Покупатель», «Корзина», «Заказ». Это гораздо ближе к тому, как мы думаем о предметной области в реальной жизни.

📦
Идея 2: Данные и логика живут вместе

Это главное техническое преимущество. Данные о банковском счёте (баланс, история) и операции с ним (пополнить, снять) — всё это упаковано в один объект. Случайно применить «снятие денег» к счёту другого человека становится крайне сложно — объект сам знает, с какими данными он работает.

♻️
Идея 3: Код легко переиспользовать

Написал один раз — используй везде. Создал класс «Пользователь» с авторизацией, профилем и настройками? Теперь в любом месте программы можно создать нового пользователя в одну строку. Больше не нужно копировать функции из файла в файл — просто используй объект.

🏗️ Класс и объект: чертёж и дом

Вот мы добрались до двух самых важных терминов в ООП. Их нужно понять раз и навсегда, потому что они — основа основ.

📐
Класс — это чертёж

Класс описывает шаблон: какие данные будет хранить объект и какие операции над ним можно выполнять. Класс сам по себе — это ещё не реальный объект. Это инструкция по его созданию.

🏠
Объект — это конкретный экземпляр

Объект — это конкретная «живая» вещь, созданная по классу-чертежу. По одному чертежу можно построить сколько угодно домов. По одному классу — создать сколько угодно объектов.

Давайте разберём на примере. Представьте, что вы проектируете автомобили. Сначала инженеры разрабатывают чертёж — это класс Car. В чертеже написано: у любого автомобиля есть марка, цвет и скорость. И любой автомобиль умеет ехать и тормозить.

Потом по этому чертежу на заводе делают конкретные машины. Машина с номером А123БВ, красного цвета, марки Toyota — это объект. Машина А456ГД, синяя, марки BMW — другой объект. Оба созданы по одному чертежу (классу), но каждый живёт своей жизнью со своими данными.

# Класс — это чертёж (шаблон)
class Car:
    def __init__(self, brand, color):
        self.brand = brand   # атрибут — данные объекта
        self.color = color   # атрибут — данные объекта

    def drive(self):         # метод — поведение объекта
        print(f"{self.brand} едет!")

# Объекты — конкретные экземпляры, созданные по чертежу
car1 = Car("Toyota", "красный")
car2 = Car("BMW", "синий")

car1.drive()  # Toyota едет!
car2.drive()  # BMW едет!

Посмотрите на код выше. Не нужно пока понимать каждую строчку — мы разберём синтаксис в следующих уроках. Сейчас важно уловить суть: мы описали шаблон один раз, а потом создали по нему двух независимых «живых» автомобилей.

🔑 Запомните: Класс — это тип (чертёж, шаблон). Объект — это конкретный экземпляр этого типа. Один класс → много объектов. У каждого объекта свои данные, но общее поведение (методы).

Ещё несколько примеров, чтобы закрепить:

Класс: User

Объекты: конкретный пользователь «Иван», «Мария», «admin»

Класс: BankAccount

Объекты: счёт №001 (баланс 50 000₽), счёт №002 (баланс 12 000₽)

Класс: Product

Объекты: товар «Ноутбук» (цена 80 000₽), «Мышь» (цена 1 500₽)

Класс: str (строка)

Объекты: "привет", "мир", "Python"

Последний пример особенно интересный: в Python абсолютно всё является объектом. Строка — объект. Число — объект. Список — объект. Даже функция — объект! Когда вы пишете "hello".upper() — вы вызываете метод upper() у объекта строки. Вот так незаметно вы уже пользовались ООП с первого дня изучения Python.

🌐 Где ООП живёт в реальной разработке

Теория — это хорошо, но давайте посмотрим, где вы встретите ООП в живом коде. Спойлер: буквально везде.

🟢 Django: веб-фреймворк

Django — самый популярный Python-фреймворк для веб-разработки — буквально построен на классах. Каждая таблица в базе данных — это класс. Каждая страница сайта — это класс. Это не случайность: ООП идеально подходит для веба, где у вас есть сущности (пользователи, статьи, заказы) с поведением.

# Django ORM: класс = таблица в базе данных
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

    def get_short_preview(self):
        return self.content[:100] + "..."

# Работаем с объектами, а не с SQL напрямую
articles = Article.objects.filter(author=current_user)
for article in articles:
    print(article.get_short_preview())

🎮 Разработка игр (Pygame)

В играх ООП особенно естественен. Игровой персонаж — это объект с координатами, здоровьем, оружием. Пуля — объект с направлением и скоростью. Враг — объект с ИИ-логикой. Каждый тип сущности описывается своим классом.

class Player:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.health = 100
        self.score = 0

    def move(self, dx, dy):
        self.x += dx
        self.y += dy

    def take_damage(self, amount):
        self.health -= amount
        if self.health <= 0:
            print("Game over!")

class Enemy:
    def __init__(self, x, y, damage):
        self.x = x
        self.y = y
        self.damage = damage

    def attack(self, player):
        player.take_damage(self.damage)

🖥️ Графические интерфейсы (GUI)

Кнопка на экране — объект. Поле ввода — объект. Окно приложения — объект. Библиотеки Tkinter, PyQt, wxPython используют ООП как основу. Когда вы наследуете от класса QWidget и создаёте своё окно — вы используете один из мощнейших механизмов ООП (наследование).

Также ООП широко используется в:

  • REST API — классы-представления (Class-Based Views) в Django REST Framework
  • Парсинг данных — объекты для структурирования результатов
  • Machine Learning — sklearn, PyTorch используют классы для моделей
  • Тестирование — классы TestCase в pytest и unittest
  • Боты — Telegram-боты с python-telegram-bot строятся на классах

🚫 Когда ООП не нужен

Хороший разработчик знает не только когда применять инструмент, но и когда его не применять. ООП — не серебряная пуля. Вот случаи, когда он скорее усложнит жизнь, чем упростит:

📜
Маленькие скрипты

Скрипт в 30 строк, который переименовывает файлы или конвертирует CSV — просто набор функций. Создавать классы здесь — избыточно.

🔄
ETL-задачи и пайплайны

«Взять данные отсюда → обработать → положить туда» — это поток трансформаций. Функциональный подход с pandas/polars здесь чище и понятнее.

⚡
Разовые утилиты

Скрипт запускается один раз, делает своё дело и забывается. Нет смысла выстраивать архитектуру ради одноразового инструмента.

🧮
Математические вычисления

Numpy и scipy работают с массивами и функциями. Оборачивать их в классы ради классов — бессмысленно.

⚠️ Ловушка «классомании»: новички, узнав про ООП, иногда начинают оборачивать в классы всё подряд — даже функции из трёх строк. Это называют «overengineering». Правило простое: если у вас нет нескольких взаимосвязанных данных с поведением, которые будут жить в программе как самостоятельные сущности — вам, скорее всего, класс не нужен.

🎯 Главная мысль: ООП — инструмент, а не догма

В интернете много споров: «ООП лучше», «нет, функциональное программирование лучше», «нет, процедурное!». Это бессмысленный холивар. Каждый подход — это инструмент, и у каждого есть своя область применения.

Молоток — отличный инструмент для гвоздей. Но вы же не используете молоток, чтобы закрутить шуруп? Так же и с ООП: это мощный инструмент для задач определённого типа — больших программ с множеством взаимодействующих сущностей, долгоживущих систем, кода, который будут поддерживать разные разработчики.

«Объектно-ориентированное программирование — это способ организации кода, при котором мы моделируем реальный мир в виде объектов, объединяющих данные и поведение. Это инструмент для создания понятного, масштабируемого и переиспользуемого кода — но не единственно верный способ программировать.»

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

В этом курсе мы изучим ООП не как религию, а как один из главных инструментов Python-разработчика. Научимся понимать, когда он уместен, и применять его грамотно.

✅ Итоги урока

  • До ООП данные и функции жили отдельно — это создавало хаос в больших программах
  • ООП появилось из идеи моделировать реальный мир: объекты объединяют данные и поведение
  • Класс — это чертёж (шаблон). Объект — конкретный экземпляр, созданный по классу
  • Три идеи ООП: моделируем реальность, данные и логика вместе, код легко переиспользовать
  • ООП используется в Django, веб-разработке, играх, GUI, ML-фреймворках
  • В Python всё является объектом — вы уже использовали ООП, даже не зная об этом
  • ООП — инструмент, а не догма. Он не нужен в маленьких скриптах и одноразовых задачах

В следующем уроке мы напишем первый класс на Python, разберём синтаксис, метод __init__ и создадим наши первые объекты. 🚀

На следующий урок