Урок 66 — Теория: Основы ООП
⚡ Кратко
ООП — это подход, при котором программа представляется как набор объектов. Объект создаётся по шаблону — классу. Класс задаёт поля (данные) и методы (поведение). Инициализация полей происходит в методе __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— переменная, в которую сохраняется созданный объект.
Что происходит при создании объекта
- Python вызывает метод
__new__()— создаёт пустой объект. - Затем вызывает
__init__()— инициализирует поля объекта черезself. - Возвращается готовый объект, с которым можно работать.
🔍 Доступ к полям объекта
После создания объекта можно обратиться к его полям, чтобы получить или изменить их значения.
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 Новый.