Классы и объекты

В этой статье мы более подробно разберем основные строительные блоки объектно-ориентированного программирования — классы и объекты. Эти концепции лежат в основе ООП и помогут вам структурировать ваш код наиболее эффективным способом. 🧱

Что такое класс?

Класс — это шаблон или "чертеж", который определяет структуру и поведение объектов определенного типа. Класс описывает, какие данные (атрибуты) будут содержать объекты и какие операции (методы) они смогут выполнять.

Если продолжать аналогию со строительством, то класс — это как проект дома, а объект — это конкретный дом, построенный по этому проекту.

Синтаксис создания класса

В Python класс создается с использованием ключевого слова class:

Python 3.13
>>> class Person:
...     """Это документация класса Person.
...     Класс представляет человека с именем и возрастом."""

>>>     # Конструктор класса
...     def __init__(self, name, age):
...         self.name = name  # атрибут экземпляра
...         self.age = age    # атрибут экземпляра

>>>     # Метод класса
...     def greet(self):
...         return f"Привет! Меня зовут {self.name}, мне {self.age} лет."

# Посмотрим документацию класса
>>> print(Person.__doc__)
Это документация класса Person.
Класс представляет человека с именем и возрастом.

Основные элементы, которые определяются в классе:

  1. Имя класса — имя должно следовать соглашению PascalCase (каждое слово с большой буквы, без подчеркиваний)
  2. Документация — строка документации, описывающая назначение класса
  3. Конструктор — специальный метод __init__, который вызывается при создании нового экземпляра
  4. Атрибуты — переменные, хранящие данные класса или экземпляра
  5. Методы — функции, определенные внутри класса, которые могут работать с атрибутами класса

Что такое объект?

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

Объекты создаются путем вызова класса, как если бы это была функция:

Python 3.13
# Создаем объекты класса Person
>>> person1 = Person("Анна", 25)
>>> person2 = Person("Иван", 30)

# Используем методы объектов
>>> print(person1.greet())
Привет! Меня зовут Анна, мне 25 лет.
>>> print(person2.greet())
Привет! Меня зовут Иван, мне 30 лет.
# Доступ к атрибутам объекта >>> print(f"Имя второго человека: {person2.name}")
Имя второго человека: Иван
>>> print(f"Возраст первого человека: {person1.age}")
Возраст первого человека: 25

Обратите внимание:

  • Каждый объект имеет свое собственное состояние (значения атрибутов)
  • Все объекты одного класса имеют одинаковый набор методов
  • Изменение атрибутов одного объекта не влияет на другие объекты

Понимание параметра self

Вы, наверное, заметили параметр self в определении методов класса. Это специальный параметр, который ссылается на конкретный экземпляр класса.

  • self автоматически передается при вызове метода через объект
  • Через self мы получаем доступ к атрибутам и другим методам экземпляра
  • Хотя имя self не является обязательным, это общепринятое соглашение в Python
Python 3.13
>>> class Demo:
...     def method1(self):
...         return "Метод 1 вызван"

>>>     def method2(self):
...         # Вызов другого метода через self
...         return f"Метод 2 вызван и внутри него: {self.method1()}"

>>> demo = Demo()
>>> print(demo.method2())
Метод 2 вызван и внутри него: Метод 1 вызван

Изменение объектов после создания

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

Python 3.13
>>> class Student:
...     def __init__(self, name):
...         self.name = name
...         self.grades = []  # пустой список оценок

>>>     def add_grade(self, grade):
...         self.grades.append(grade)
...         return f"Добавлена оценка: {grade}"

>>>     def average_grade(self):
...         if not self.grades:
...             return "Нет оценок"
...         return sum(self.grades) / len(self.grades)

# Создаем студента
>>> student = Student("Мария")
>>> print(f"Создан студент: {student.name}")
Создан студент: Мария
>>> print(f"Средний балл: {student.average_grade()}")
Средний балл: Нет оценок
# Добавляем оценки >>> print(student.add_grade(5))
Добавлена оценка: 5
>>> print(student.add_grade(4))
Добавлена оценка: 4
>>> print(student.add_grade(5))
Добавлена оценка: 5
# Смотрим средний балл >>> print(f"Средний балл после добавления оценок: {student.average_grade()}")
Средний балл после добавления оценок: 4.666666666666667
# Добавляем новый атрибут (не рекомендуется, но возможно) >>> student.age = 19 >>> print(f"Добавлен атрибут возраста: {student.age}")
Добавлен атрибут возраста: 19

Как правильно организовать классы?

При создании классов следуйте этим рекомендациям:

  1. Принцип единственной ответственности — класс должен иметь только одну причину для изменения
  2. Инкапсуляция — старайтесь скрывать внутренние детали реализации
  3. Согласованный интерфейс — методы класса должны предоставлять четкий, понятный интерфейс
  4. Документация — добавляйте документацию ко всем классам и методам
  5. Разумный размер — класс не должен быть слишком большим, лучше разделить его на несколько классов

Проверка понимания

Что из перечисленного верно описывает отношение между классами и объектами?

Теперь вы знаете, что такое классы и объекты в Python, и как их создавать и использовать.

В следующей статье мы подробнее рассмотрим атрибуты и методы классов, включая различные типы атрибутов (экземпляра и класса) и специальные методы Python. До встречи! 👋


Мы с вами на связи
Русский