Вы уже умеете писать функции, чтобы код был понятным и без повторов. Но что, если нужно работать со сложными сущностями, у которых есть свои характеристики и поведение? Например, описать пользователя, автомобиль или банковский счёт? Для этого в программировании есть мощный инструмент — объектно-ориентированное программирование (ООП). Его фундамент — классы и объекты.
Что такое класс?
Представьте класс как чертёж, шаблон или проект. Сам по себе чертёж — не готовый продукт, но в нём есть все инструкции для создания.
В Python класс описывает, какими характеристиками (данными) и поведением (функциями) будут обладать сущности, созданные на его основе.
Возьмём пример: класс Car (Автомобиль) может содержать:
- Характеристики (атрибуты): марка, модель, цвет, год выпуска, пробег.
- Поведение (методы): завестись, поехать, затормозить, открыть двери.
# Объявляем класс
class Car:
pass # Заглушка, пока класс пустой
Ключевое слово class объявляет класс. За ним идёт имя класса. По соглашению, имена классов пишутся с большой буквы, например, MyClass.
Что такое объект?
Если класс — это чертёж, то объект (или экземпляр класса) — это уже конкретный продукт, созданный по этому чертежу. У вас может быть один чертёж автомобиля, но по нему можно построить множество разных машин.
Каждый объект, созданный на основе одного класса, будет иметь свои значения характеристик, но при этом обладать тем же набором поведения.
Создание объекта из класса называется инстанцированием.
# Создаём объекты (экземпляры) класса Car
my_car = Car()
your_car = Car()
print(f"Тип переменной my_car: {type(my_car)}")
print(f"Тип переменной your_car: {type(your_car)}")
В этом примере my_car и your_car — два разных объекта класса Car.
Атрибуты: характеристики объектов
Чтобы объекты имели уникальные характеристики, мы добавляем им атрибуты. Атрибуты — это переменные, которые принадлежат объекту.
Есть два основных способа определить атрибуты:
- Атрибуты класса: общие для всех объектов данного класса. Определяются внутри класса, но вне методов.
- Атрибуты экземпляра: уникальные для каждого конкретного объекта. Обычно определяются внутри специального метода
__init__.
Метод __init__ и атрибуты экземпляра
Метод __init__ (читается как "инит") — это специальный метод, который автоматически вызывается при создании нового объекта. Он используется для инициализации (первоначальной настройки) объекта, то есть для присвоения начальных значений его атрибутам.
self: Первый параметр любого метода класса (включая__init__) всегдаself. Это ссылка на сам созданный объект. Черезselfмы получаем доступ к атрибутам и другим методам этого конкретного объекта.
class Car:
# Атрибут класса (общий для всех машин)
wheels = 4
def __init__(self, brand, model, color, year):
# Атрибуты экземпляра (уникальные для каждой машины)
self.brand = brand
self.model = model
self.color = color
self.year = year
self.mileage = 0 # Начальный пробег всегда 0
# Создаём объекты с разными характеристиками
car1 = Car("Lada", "Granta", "белый", 2022)
car2 = Car("Kia", "Rio", "черный", 2023)
print(f"Машина 1: {car1.brand} {car1.model}, цвет: {car1.color}, год: {car1.year}, пробег: {car1.mileage}")
print(f"Машина 2: {car2.brand} {car2.model}, цвет: {car2.color}, год: {car2.year}, пробег: {car2.mileage}")
# Доступ к атрибуту класса
print(f"У всех машин {Car.wheels} колеса.")
print(f"У car1 {car1.wheels} колеса.")
Важно: Имена атрибутов экземпляра
self.brand,self.modelи т.д. не обязательно должны совпадать с именами параметров метода__init__, но это хорошая практика для читаемости кода.
Методы: поведение объектов
Методы — это функции, определённые внутри класса, которые описывают поведение объектов этого класса. Они могут использовать и изменять атрибуты объекта.
class Car:
wheels = 4
def __init__(self, brand, model, color, year):
self.brand = brand
self.model = model
self.color = color
self.year = year
self.mileage = 0
# Метод для вывода информации о машине
def display_info(self):
print(f"Автомобиль: {self.brand} {self.model}")
print(f"Цвет: {self.color}, Год: {self.year}, Пробег: {self.mileage} км")
# Метод для увеличения пробега
def drive(self, distance):
if distance > 0:
self.mileage += distance
print(f"Проехали {distance} км. Текущий пробег: {self.mileage} км.")
else:
print("Расстояние должно быть положительным.")
# Создаём объект
my_car = Car("Lada", "Vesta", "синий", 2021)
# Вызываем методы объекта
my_car.display_info()
my_car.drive(150)
my_car.display_info()
my_car.drive(-10) # Пример некорректного ввода
Как видите, методы также принимают self в качестве первого параметра, чтобы иметь доступ к атрибутам и другим методам этого конкретного объекта.
Зачем нужны классы и объекты?
ООП — это не просто набор правил, а мощный подход, который помогает:
- Моделировать реальный мир: Переносите сущности из реального мира в код, делая его понятнее и интуитивнее.
- Структурировать код: Организуйте код, группируя связанные данные (атрибуты) и поведение (методы) в одном месте.
- Повторно использовать код: Однажды написанный класс можно использовать для создания множества объектов, избегая дублирования.
- Упрощать поддержку: Изменения в логике или данных, относящихся к сущности, вносятся только в её класс.
Практическое задание 🚀
Представьте, что вы разрабатываете систему управления библиотекой. Создайте класс Book, который будет описывать книгу.
Требования к классу Book:
- Атрибуты экземпляра:
title(название книги)author(автор)isbn(уникальный международный стандартный книжный номер)is_available(булево значение,Trueесли книга доступна,Falseесли выдана) — по умолчаниюTrue
- Методы:
__init__: для инициализации книги с указанными атрибутами.borrow_book(): меняетis_availableнаFalseи выводит сообщение, что книга выдана. Если книга уже выдана, выводит соответствующее сообщение.return_book(): меняетis_availableнаTrueи выводит сообщение, что книга возвращена. Если книга уже доступна, выводит соответствующее сообщение.display_book_info(): выводит полную информацию о книге (название, автор, ISBN, статус доступности).
Пример использования:
# Создайте объект класса Book
# book1 = Book("Война и мир", "Лев Толстой", "978-5-17-040924-6")
# Вызовите методы:
# book1.display_book_info()
# book1.borrow_book()
# book1.display_book_info()
# book1.borrow_book() # Попробуйте выдать уже выданную книгу
# book1.return_book()
# book1.display_book_info()
Попробуйте реализовать этот класс самостоятельно. Это поможет вам закрепить понимание классов, объектов, атрибутов и методов.
Вы только что приоткрыли дверь в мир объектно-ориентированного программирования. Далее мы углубимся в то, как атрибуты и методы взаимодействуют, и изучим ключевые принципы ООП, которые сделают ваш код ещё более мощным и гибким.