Дескрипторы являются атрибутами класса и, следовательно, должны быть определены на уровне класса.
Функция f
в последнем примере является атрибутом экземпляра, как установлено внутри __init__
путем привязки к атрибуту с именем f
к объекту ввода, указанному f
. Поскольку это не атрибут класса, он никогда не будет классифицирован как дескриптор.
Теперь, с точки зрения вызывающего, staticmethod
является атрибутом класса, так как он реализован на уровне класса, например, как:
class Foo:
@staticmethod
def bar():
return 10
декоратор - это только синтаксический сахар, вы можете очень хорошо написать как:
class Foo:
def bar():
return 10
bar = staticmethod(bar)
, поэтому в этом случае он будет рассматриваться как дескриптор.