5

我试图了解描述符如何在 python 中工作。我得到了大局,但我在理解 @staticmethod 装饰器时遇到了问题。

我具体指的代码来自相应的python doc: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被识别为描述符(因为每个函数都是非数据描述符),因此会绑定到 self,它是一个 StaticMethod 对象?

4

1 回答 1

5

描述符是类属性,因此需要在类级别定义。

最后一个示例中的函数f是一个实例属性,__init__通过绑定到命名f为由 引用的输入对象的属性在内部设置f。由于它不是类属性,因此永远不会被归类为描述符。


现在,从调用者的角度来看,staticmethod是一个类属性,因为它是在类级别实现的,例如:

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

装饰器只是一个语法糖,你可以很好地写成:

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

因此在这种情况下它将被视为描述符。

于 2019-11-01T12:55:13.777 回答