✅ Решения заданий

⚠️ Рекомендация: попробуйте решить задания самостоятельно, прежде чем смотреть ответы. Решения — это последняя инстанция, когда собственные попытки исчерпаны.

⚡ Кратко

  • 1.1 — c, 1.2 — a, 1.3 — повторяет вызов три раза, 1.4 — b, 1.5 — a/c, 1.6 — не вызывает func(*args, **kwargs).
  • 2.1 — b, 2.2 — b, 2.3 — c, 2.4 — нет self, 2.5 — забыты скобки создания объекта, 2.6 — d.
  • Класс Circle хранит radius и считает площадь через math.pi.

Ответы на тестовые вопросы

ВопросОтветПояснение
1.1cСначала wrapper печатает аргумент, затем возвращает результат square(4).
1.2aБез @functools.wraps декорированная функция получает имя и документацию wrapper.
1.3Повторяет вызов при ошибке три разаЦикл range(3) с try/except пытается выполнить функцию.
1.4bСначала применяется нижний декоратор B, затем верхний A.
1.5a, cФабрика возвращает декоратор, а декоратор должен вызывать исходную функцию. @wraps используется во внутреннем декораторе, не в фабрике.
1.6Не запущена декорируемая функцияreturn func возвращает сам объект функции вместо результата её вызова.
2.1bПоле title получает значение "1984".
2.2bПоля сохраняются в объекте через self.
2.3cАтрибут — любая часть объекта, доступная через точку, включая поля и методы.
2.4Нет selfПервым параметром __init__ должен быть self.
2.5Нет создания объектаbook = Book присваивает класс, а не создаёт экземпляр. Нужно book = Book("...", "...").
2.6dОбъекты одного класса независимы и могут хранить разные значения полей.

Решение практического задания: Circle

import math


class Circle:
    def __init__(self, radius):
        self.radius = radius

    def get_area(self):
        return math.pi * self.radius ** 2


circle = Circle(5)
print(f"Площадь: {circle.get_area():.1f}")
circle.radius = 8
print(f"Новая площадь: {circle.get_area():.1f}")

Логика: поле radius хранится в объекте через self. Метод get_area использует формулу π · r². После изменения поля повторный вызов метода возвращает новую площадь.

Примерный вывод:

Площадь: 78.5
Новая площадь: 201.1