classmethod получает класс, staticmethod не получает скрытого аргумента, а property читается как атрибут экземпляра. В примере prop имеет лишний параметр a и ошибочно вызывается со скобками.
Обзор встроенных декораторов в Python‑классе
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.