Классы

По мере того как программы становятся больше и сложнее, управление и организация кода могут стать весьма непростой задачей. Функции и переменные могут быть разбросаны по разным частям программы, что затрудняет отслеживание происходящего и приводит к запутанному и трудному для поддержки коду. Здесь на помощь приходят классы — краеугольный камень объектно-ориентированного программирования.
💡
Классы — это способ объединения связанных данных и функций, создавая то, что мы называем 'объектами'. Классы — фундаментальные концепции в объектно-ориентированном программировании (ООП).
Классы похожи на чертежи для создания объектов в нашем коде. Каждый класс объединяет связанные свойства (данные) и методы (функции) в единые модули. Например, в игровой программе у вас могут быть такие классы, как Player, Monster или Item, каждый из которых содержит свои собственные данные и методы. Это облегчает понимание и управление большими объемами кода, так как связанные функции сгруппированы, и становится ясно, как они взаимодействуют друг с другом.
Предположим, вы хотите создать программное обеспечение для моделирования библиотеки. У вас есть книги в вашей библиотеке, поэтому вам нужно создать класс Book:
class Book:
    def __init__(self, title, author, pages):
        self.title = title     # Присваиваем название экземпляру книги
        self.author = author   # Присваиваем автора экземпляру книги
        self.pages = pages     # Присваиваем количество страниц экземпляру книги
Ключевое слово class вводит новый класс, за которым следует его имя (Book). Строка def __init__(self, title, author, pages): определяет начальное состояние класса или конструктор. Здесь объект инициализируется. self ссылается на экземпляр класса. title, author и pages — это атрибуты класса.
Вы можете создать новый объект книги, вызывая класс как функцию:
# Создаем новый экземпляр Book
mockingbird = Book('To Kill a Mockingbird', 'Harper Lee', 281)

print(mockingbird.title)   # To Kill a Mockingbird
print(mockingbird.author)  # Harper Lee
print(mockingbird.pages)   # 281
Обратите внимание, что мы передаем To Kill a Mockingbird, Harper Lee и 281 в качестве аргументов. Они передаются как аргументы в метод __init__ (почти как в обычной функции).
Мы можем создать несколько экземпляров класса Book:
# Создаем больше экземпляров книг
book2 = Book('1984', 'George Orwell', 328)
book3 = Book('The Great Gatsby', author='F. Scott Fitzgerald', pages=180)
book4 = Book('Moby Dick', 'Herman Melville', pages=720)

# Выводим информацию о книгах
print(f'{book2.title} by {book2.author} has {book2.pages} pages.')  # 1984 by George Orwell has 328 pages.
print(f'{book3.title} by {book3.author} has {book3.pages} pages.')  # The Great Gatsby by F. Scott Fitzgerald has 180 pages.
print(f'{book4.title} by {book4.author} has {book4.pages} pages.')  # Moby Dick by Herman Melville has 720 pages.
Так же, как и с функциями, мы можем передавать как позиционные, так и именованные аргументы в метод __init__.
Помимо данных, классы могут также инкапсулировать функциональность. Предположим, в нашей библиотечной системе мы хотим отметить книгу как прочитанную. Мы можем определить метод в нашем классе Book для этой цели:
class Book:
    def __init__(self, title, author, pages):
        self.title = title     # Присваиваем название экземпляру книги
        self.author = author   # Присваиваем автора экземпляру книги
        self.pages = pages     # Присваиваем количество страниц экземпляру книги
        self.is_read = False   # Книга еще не прочитана

    def mark_as_read(self):    # Метод класса
        self.is_read = True    # Отмечаем книгу как прочитанную


mockingbird = Book('To Kill a Mockingbird', 'Harper Lee', 281)
print(mockingbird.is_read)   # False, книга еще не прочитана
mockingbird.mark_as_read()   # Отмечаем книгу как прочитанную
print(mockingbird.is_read)   # True, книга прочитана
Метод mark_as_read изменяет состояние атрибута is_read на True. Мы можем вызвать этот метод на любом экземпляре книги. Это демонстрирует, как мы можем объединять связанные данные и функциональность с помощью классов в Python.
💡
В Python self — это общепринятое имя для первого параметра в методах экземпляра класса. Это ссылка на текущий экземпляр класса. self используется для доступа к атрибутам и методам класса внутри его определения. Когда вы создаете новый объект класса, Python автоматически связывает аргумент self с этим новым объектом, поэтому вам не передаете self, когда вызываете метод экземпляра. Хотя self не является зарезервированным ключевым словом в Python, оно широко используется благодаря ясному и понятному стилю, который оно поощряет. Важно отметить, что вы могли бы использовать любое другое имя, но использование self настоятельно рекомендуется сообществом и считается лучшей практикой.

Задача: Создайте класс Car

Вам нужно создать класс Car, который должен иметь следующие атрибуты:
  • color (цвет автомобиля)
  • make (марка автомобиля)
  • model (модель автомобиля)
  • year (год выпуска)
Эти атрибуты должны быть инициализированы в методе __init__ класса.
Кроме того, класс Car должен иметь метод display_details. Этот метод должен возвращать строковое представление деталей автомобиля в формате [year] [color] [make] [model].
Ввод
Вывод
c = Car('red', 'Ferrari', 'F8', 2023); print(c.display_details())
2023 red Ferrari F8
c = Car('black', 'Tesla', 'Model S', 2021); print(c.display_details())
2021 black Tesla Model S
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue