Как статический метод не связан с классом "статический метод"? - PullRequest
5 голосов
/ 01 ноября 2019

Я пытаюсь понять, как работают дескрипторы в python. Я получил общую картину, но у меня проблемы с пониманием декоратора @staticmethod.

Код, на который я ссылаюсь конкретно, взят из соответствующего документа на python: https://docs.python.org/3/howto/descriptor.html

class Function(object):
    . . .
    def __get__(self, obj, objtype=None):
        "Simulate func_descr_get() in Objects/funcobject.c"
        if obj is None:
            return self
        return types.MethodType(self, obj)
class StaticMethod(object):
    "Emulate PyStaticMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f

    def __get__(self, obj, objtype=None):
        return self.f

Мой вопрос таков: когда к self.f обращаются в последней строке, f не распознается как дескриптор сам (потому что каждая функция не является дескриптором данных) и, таким образом, привязывается к себе, что являетсяОбъект StaticMethod?

1 Ответ

5 голосов
/ 01 ноября 2019

Дескрипторы являются атрибутами класса и, следовательно, должны быть определены на уровне класса.

Функция f в последнем примере является атрибутом экземпляра, как установлено внутри __init__ путем привязки к атрибуту с именем f к объекту ввода, указанному f. Поскольку это не атрибут класса, он никогда не будет классифицирован как дескриптор.


Теперь, с точки зрения вызывающего, staticmethod является атрибутом класса, так как он реализован на уровне класса, например, как:

class Foo:
    @staticmethod
    def bar():
        return 10

декоратор - это только синтаксический сахар, вы можете очень хорошо написать как:

class Foo:
    def bar():
        return 10
    bar = staticmethod(bar)

, поэтому в этом случае он будет рассматриваться как дескриптор.

...