Урок 66 — Теория: Основы ООП

📁 Блок: Python Fundamentals / ООП ⏱️ Время изучения: ~40 мин 🎯 Сложность: Средняя
#class #pass #def #print #return

⚡ Кратко

ООП — это подход, при котором программа представляется как набор объектов. Объект создаётся по шаблону — классу. Класс задаёт поля (данные) и методы (поведение). Инициализация полей происходит в методе __init__ через self.

📖 Что такое ООП

Объектно-ориентированное программирование (ООП) — это подход к написанию программ, в котором основное внимание уделяется объектам и их взаимодействию.

ООП описывает сущности реального мира в виде объектов, которые объединяют:

  • Поля (данные, состояние) — например, имя, возраст, цена.
  • Методы (поведение) — действия, которые можно выполнять с объектом.

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

Класс

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

  • Какие данные будут у объектов (например, title, author).
  • Какие методы можно будет с ними выполнять (например, show_description()).

Объект

Объект — это конкретный экземпляр класса, созданный по его шаблону. У него уже есть конкретное состояние и возможность выполнять определённые действия.

class Book:
    def __init__(self, title: str, author: str) -> None:
        self.title = title
        self.author = author


book1 = Book("1984", "George Orwell")
print(book1.title, book1.author)

Здесь Book — класс, а book1 — объект с конкретным названием и автором.

⚔️ ООП vs функциональный подход

Объектно-ориентированный подходФункциональный подход
Основан на объектах и классахОснован на функциях как основных строительных блоках
Основные единицы — объекты, которые хранят состояние и имеют поведениеДанные и поведение строго разделены: функции обрабатывают данные, не изменяя их
Программа строится как система взаимодействующих объектовЧасто используются чистые функции — одинаковый результат при одинаковом вводе
Удобен, когда нужно моделировать сущности реального мираПредпочтение отдаётся неизменяемым структурам и отсутствию побочных эффектов
Хорошо подходит для сложных, расширяемых программХорошо подходит для математических расчётов, анализа данных, обработки потоков информации

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

Преимущества ООП

  • Упрощает моделирование реальных сущностей.
  • Позволяет структурировать сложные программы.
  • Облегчает расширение и сопровождение программ.
  • Повышает переиспользуемость и читаемость кода.

🏗️ Создание класса

Для создания класса используется ключевое слово class, за которым следует имя класса.

# Пустой класс без полей и методов
class ClassName:
    pass

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

  • Имя класса пишется с заглавной буквы.
  • Если имя состоит из нескольких слов, используется стиль CamelCase (например, UserProfile, ShoppingCart).
  • Не стоит использовать имена, совпадающие с встроенными типами: list, str, object и т.д.

🔧 Метод __init__

Магический метод __init__() — это инициализатор, который автоматически вызывается при создании объекта. Он отвечает за установку начального состояния объекта.

Конструктор — это метод __new__(), который создаёт, то есть конструирует объект (также вызывается автоматически).

Инициализатор — это метод __init__(), который инициализирует поля в уже созданном объекте.

Синтаксис __init__

class ClassName:
    def __init__(self, arg1, arg2):
        self.attr1 = arg1
        self.attr2 = arg2
  • arg1, arg2 — значения, передаваемые при создании объекта.
  • attr1, attr2 — поля или свойства объекта, сохраняемые через self.
  • self — только что созданный объект, которому будут присвоены поля.

Особенности __init__

  • Вызывается автоматически при создании объекта.
  • Называется строго __init__.
  • Обязан принимать первым аргументом self — ссылку на текущий объект.
  • Через self задаются поля объекта — переменные, которые будут ему «принадлежать».
  • Может отсутствовать, если класс не имеет состояния.

🧩 Поля, методы и атрибуты

  • Поля — переменные, которые хранят состояние объекта. Задаются обычно через __init__ и сохраняются внутри самого объекта.
  • Методы — функции, определённые внутри класса. Они описывают, что умеет делать объект.
  • Атрибут — общее название для любой части объекта, доступной через точку: object.something.

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

👤 Параметр self

self — это обязательный первый параметр в методах класса, который является ссылкой на объект.

  • self не является зарезервированным словом, но принято использовать именно его.
  • Позволяет сохранить данные внутри объекта.
  • Даёт доступ к полям и методам объекта.
  • Отличает свойства объекта от обычных переменных внутри метода.

Без self переменные были бы локальными переменными метода и исчезли бы после выхода из него.

🆕 Создание объекта

После того как класс определён, можно создавать объекты.

book = Book("1984", "George Orwell")
  • ClassName — имя класса, по шаблону которого создаётся объект.
  • arg1, arg2 — значения, которые ожидаются в методе __init__.
  • object_name — переменная, в которую сохраняется созданный объект.

Что происходит при создании объекта

  1. Python вызывает метод __new__() — создаёт пустой объект.
  2. Затем вызывает __init__() — инициализирует поля объекта через self.
  3. Возвращается готовый объект, с которым можно работать.

🔍 Доступ к полям объекта

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

book = Book("1984", "George Orwell")
print(book.title)   # доступ к полю title
book.title = "Animal Farm"
print(book.title)   # изменённое значение
  • object_name — имя переменной, в которой хранится ссылка на объект.
  • attribute — имя поля, к которому обращаемся.

Каждое поле относится конкретно к своему объекту — изменение в одном объекте не влияет на другие.

🛠️ Методы класса

Методы — это функции, определённые внутри класса. Они описывают поведение объекта.

class ClassName:
    def method_name(self):
        pass
  • Метод обязательно принимает первым параметром self — ссылку на текущий объект.
  • Через self метод может обращаться к полям объекта и вызывать другие его методы.
  • Методы вызываются через точку: object.method().
  • При вызове book.show_info() Python автоматически подставляет ссылку из переменной book в переменную self.

Проверить по документации: современные подходы — аннотации типов, __repr__, dataclasses и slots — рассмотрены в разделе ⚖️ Старый vs Новый.