Python
Задачи на ООП Python
ООП в Python становится понятнее не после определений, а после маленьких классов: пользователь, счетчик, товар, банковский счет, задача
Здесь нет тяжелой теории. Каждая задача показывает, какие данные хранит объект и какие действия он умеет выполнять
Как работать с подборкой
Материал помогает связать class, __init__, self, атрибуты и методы с понятными примерами
Перед просмотром решения попробуйте написать хотя бы черновик. Если задача не идет, выпишите входные данные, ожидаемый результат и одно действие, которое нужно сделать первым
После решения измените данные и запустите код снова. Так вы быстрее увидите, где программа привязана только к одному примеру
Задачи с решениями
Задача 1. Класс User
Условие: Создайте класс пользователя с именем и методом приветствия
Подсказка: self нужен, чтобы метод работал с данными конкретного объекта
Решение:
class User:
def __init__(self, name):
self.name = name
def greet(self):
return f"Привет, {self.name}"
user = User("Анна")
print(user.greet())
Проверка: Создайте двух пользователей и сравните приветствия
Задача 2. Счетчик
Условие: Создайте класс Counter с методами increase и reset
Подсказка: Состояние счетчика хранится в атрибуте объекта
Решение:
class Counter:
def __init__(self):
self.value = 0
def increase(self):
self.value += 1
def reset(self):
self.value = 0
counter = Counter()
counter.increase()
counter.increase()
print(counter.value)
Проверка: После двух increase значение должно быть 2
Задача 3. Товар со скидкой
Условие: Создайте класс Product с ценой и методом discounted_price
Подсказка: Метод может принимать процент скидки как аргумент
Решение:
class Product:
def __init__(self, title, price):
self.title = title
self.price = price
def discounted_price(self, percent):
return self.price - self.price * percent / 100
product = Product("Курс", 5000)
print(product.discounted_price(20))
Проверка: Для 5000 и 20 результат должен быть 4000
Задача 4. Банковский счет
Условие: Создайте счет с пополнением и списанием
Подсказка: При списании проверьте, хватает ли денег
Решение:
class BankAccount:
def __init__(self, balance=0):
self.balance = balance
def deposit(self, amount):
self.balance += amount
def withdraw(self, amount):
if amount > self.balance:
return "Недостаточно средств"
self.balance -= amount
return "Списание выполнено"
account = BankAccount(1000)
print(account.withdraw(300))
print(account.balance)
Проверка: Проверьте списание суммы больше баланса
Задача 5. Задача в списке дел
Условие: Создайте класс Task с названием и статусом done
Подсказка: Метод complete должен менять статус задачи
Решение:
class Task:
def __init__(self, title):
self.title = title
self.done = False
def complete(self):
self.done = True
task = Task("Повторить классы")
task.complete()
print(task.done)
Проверка: Создайте две задачи с разными статусами
Задача 6. Корзина покупок
Условие: Создайте класс Cart, который хранит товары и считает итог
Подсказка: Внутри объекта удобно хранить список цен
Решение:
class Cart:
def __init__(self):
self.prices = []
def add(self, price):
self.prices.append(price)
def total(self):
return sum(self.prices)
cart = Cart()
cart.add(100)
cart.add(250)
print(cart.total())
Проверка: Проверьте пустую корзину
Задача 7. Книга
Условие: Создайте класс Book с автором, названием и методом description
Подсказка: Метод должен возвращать строку, а не печатать ее сразу
Решение:
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
def description(self):
return f"{self.author}: {self.title}"
book = Book("Python", "Автор")
print(book.description())
Проверка: Создайте список книг и выведите описания в цикле
Задача 8. Студент и средний балл
Условие: Создайте класс Student, который хранит оценки и считает среднее
Подсказка: Если оценок нет, верните 0
Решение:
class Student:
def __init__(self, name):
self.name = name
self.grades = []
def add_grade(self, grade):
self.grades.append(grade)
def average(self):
if not self.grades:
return 0
return sum(self.grades) / len(self.grades)
student = Student("Иван")
student.add_grade(5)
student.add_grade(4)
print(student.average())
Проверка: Проверьте студента без оценок
Задача 9. Прямоугольник
Условие: Создайте класс Rectangle с методами area и perimeter
Подсказка: Ширина и высота должны храниться в объекте
Решение:
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
def perimeter(self):
return 2 * (self.width + self.height)
rectangle = Rectangle(3, 4)
print(rectangle.area())
print(rectangle.perimeter())
Проверка: Для сторон 3 и 4 площадь должна быть 12, периметр 14
Задача 10. Плейлист
Условие: Создайте класс Playlist, который хранит песни и считает их количество
Подсказка: Список песен должен быть атрибутом объекта, а не общей переменной
Решение:
class Playlist:
def __init__(self, title):
self.title = title
self.songs = []
def add_song(self, song):
self.songs.append(song)
def count(self):
return len(self.songs)
playlist = Playlist("Учебный")
playlist.add_song("Track 1")
playlist.add_song("Track 2")
print(playlist.count())
Проверка: Создайте два плейлиста и убедитесь, что песни не смешиваются
По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы
Как проверять свои решения
Для каждой задачи сделайте минимум три запуска: обычный пример, крайний пример и пример с неожиданными данными. Для чисел это может быть ноль или отрицательное значение, для строк — пустая строка, для списков — пустой список или повторяющиеся элементы
Если код работает, объясните его словами. Скажите, какие данные приходят на вход, что хранится в переменных, где меняется результат и почему программа останавливается
Частые ошибки новичков
- читать решение, но не запускать его руками
- менять сразу несколько строк и не понимать, какая из них сломала код
- называть переменные одной буквой там, где можно написать понятное имя
- забывать проверять пустые строки, пустые списки и ноль
- путать вывод через print и возврат результата через return
- оставлять код рабочим только для одного заранее выбранного примера
Дополнительные задачи
Задача 11. Класс TodoItem
Условие: Создайте задачу с названием и признаком выполнения
class TodoItem:
def __init__(self, title):
self.title = title
self.done = False
def complete(self):
self.done = True
task = TodoItem("Выучить классы")
task.complete()
print(task.title, task.done)
Проверка: Добавьте метод reset, который возвращает задачу в состояние False
Задача 12. Класс Counter
Условие: Счетчик должен увеличиваться, уменьшаться и показывать текущее значение
class Counter:
def __init__(self):
self.value = 0
def increment(self):
self.value += 1
def decrement(self):
self.value -= 1
counter = Counter()
counter.increment()
counter.increment()
counter.decrement()
print(counter.value)
Проверка: Запретите счетчику уходить ниже нуля