Обзор встроенных декораторов в Python‑классе

classmethod получает класс, staticmethod не получает скрытого аргумента, а property читается как атрибут экземпляра. В примере prop имеет лишний параметр a и ошибочно вызывается со скобками.

Короткий ответ

Что ответить на собеседовании

classmethod получает класс, staticmethod не получает скрытого аргумента, а property читается как атрибут экземпляра. В примере prop имеет лишний параметр a и ошибочно вызывается со скобками.

Подробный разбор

Ответ с пояснениями

Условие

Объясните, как работают стандартные декораторы, применяемые к методам класса, и продемонстрируйте их использование как через сам класс, так и через его экземпляр.

class Sample:
    value = 1

    @classmethod
    def cls_meth(cls, a):
        return cls.value + a

    @staticmethod
    def stc_meth(a):
        return a * a

    @property
    def prop(self, a):
        return self.value

Sample.cls_meth(1)
Sample.stc_meth(1)
Sample.prop()

s = Sample()

s.cls_meth(1)
s.stc_meth(1)
s.prop()

Ответ

classmethod получает класс, staticmethod не получает скрытого аргумента, а property читается как атрибут экземпляра. В примере prop имеет лишний параметр a и ошибочно вызывается со скобками.

Sample.cls_meth(1) и s.cls_meth(1) возвращают 2; оба варианта stc_meth(1) возвращают 1. Исправленное свойство:

@property
def prop(self):
    return self.value

После этого s.prop возвращает 1. Sample.prop — объект property, не результат вычисления, поэтому Sample.prop() вызывает TypeError. В исходном коде при последовательном запуске именно этот вызов остановит программу до создания s. Если пропустить его, s.prop() сначала попытается вычислить getter, но получит ошибку отсутствующего аргумента a.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее