静态方法如何不绑定到“ staticmethod”类?

时间:2019-11-01 12:35:21

标签: python python-decorators python-descriptors

我试图了解描述符在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 个答案:

答案 0 :(得分:5)

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

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


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

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

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

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

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