Синтаксис допустим, но staticmethod ошибочно ожидает self, а property — лишний a. classmethod работает с именем self, хотя по соглашению его нужно назвать cls. Свойство читается без скобок.
Обнаружение ошибок в Python‑классе (пример 2)
Синтаксис допустим, но staticmethod ошибочно ожидает self, а property — лишний a. classmethod работает с именем self, хотя по соглашению его нужно назвать cls. Свойство читается без скобок.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Найдите логические и синтаксические недочёты в приведённом ниже фрагменте кода на Python.
class A:
attr = 1
@classmethod
def cls_meth(self, a):
return self.attr + a
@staticmethod
def stc_meth(self, a):
return a * a
@property
def prop(self, a):
return self.attr
A.cls_meth(1)
A.stc_meth(1)
A.prop()
a = A()
a.cls_meth(1)
a.stc_meth(1)
a.prop()
Ответ
Синтаксис допустим, но staticmethod ошибочно ожидает self, а property — лишний a. classmethod работает с именем self, хотя по соглашению его нужно назвать cls. Свойство читается без скобок.
Первый A.cls_meth(1) возвращает 2. Затем A.stc_meth(1) вызывает TypeError из-за отсутствующего второго аргумента, и дальнейшие строки не выполняются.
Исправления:
@classmethod
def cls_meth(cls, a):
return cls.attr + a
@staticmethod
def stc_meth(a):
return a * a
@property
def prop(self):
return self.attr
После этого класс и экземпляр могут вызывать первые два метода, а свойство читается как a.prop. A.prop — объект-дескриптор property, не вызываемая функция с готовым экземпляром.