静态方法如何不绑定到 "staticmethod" class?
How is a staticmethod not bound to to the "staticmethod" class?
我正在尝试了解描述符在 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 对象?
描述符是 class 属性,因此需要在 class 级别定义。
最后一个示例中的函数 f
是一个实例属性,通过将名为 f
的属性绑定到 f
引用的输入对象来在 __init__
中设置.由于它不是 class 属性,因此永远不会 class 化为描述符。
现在,从调用者的角度来看,staticmethod
是一个 class 属性,因为它是在 class 级别实现的,例如喜欢:
class Foo:
@staticmethod
def bar():
return 10
装饰器只是一个语法糖,你可以这样写:
class Foo:
def bar():
return 10
bar = staticmethod(bar)
因此在这种情况下它将被视为描述符。
我正在尝试了解描述符在 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 对象?
描述符是 class 属性,因此需要在 class 级别定义。
最后一个示例中的函数 f
是一个实例属性,通过将名为 f
的属性绑定到 f
引用的输入对象来在 __init__
中设置.由于它不是 class 属性,因此永远不会 class 化为描述符。
现在,从调用者的角度来看,staticmethod
是一个 class 属性,因为它是在 class 级别实现的,例如喜欢:
class Foo:
@staticmethod
def bar():
return 10
装饰器只是一个语法糖,你可以这样写:
class Foo:
def bar():
return 10
bar = staticmethod(bar)
因此在这种情况下它将被视为描述符。