gpt4 book ai didi

python - 静态方法如何不绑定(bind)到 "staticmethod"类?

转载 作者:行者123 更新时间:2023-12-04 18:55:22 24 4
gpt4 key购买 nike

我试图了解描述符如何在 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被识别为描述符本身(因为每个函数都是非数据描述符)并因此绑定(bind)到 self,这是一个 StaticMethod 对象?

最佳答案

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

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

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

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

装饰器只是一个语法糖,你可以很好地写成:
class Foo:
def bar():
return 10
bar = staticmethod(bar)

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

关于python - 静态方法如何不绑定(bind)到 "staticmethod"类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58659339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com