"静态方法对象"和"类方法对象"没有"可调用类型"吗?

Tim*_*Tim 2 python python-3.x

Python语言参考,第3章Datamodel中,为什么"实例方法"列在"可调用类型"下,而"静态方法对象"和"类方法对象"列在"内部类型"下?

可调用类型这些类型可以应用函数调用操作(请参阅调用部分)...

实例方法......

内部类型解释器内部使用的一些类型向用户公开.他们的定义可能会随着解释器的未来版本而改变,但为了完整起见,这里提到了它们....

静态方法对象......

类方法对象......

静态和类方法对象不应该是可调用类型吗?

Jim*_*ard 5

不,staticmethods和classmethods不可调用,没有找到这样做的理由.

>>> def foo():
...     print("hello") 
>>> s = staticmethod(foo)
>>> s()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'staticmethod' object is not callable
Run Code Online (Sandbox Code Playgroud)

它们是通过描述符协议调用的,并且(通常)返回一个可调用的:

>>> s.__get__(foo)()
hello
Run Code Online (Sandbox Code Playgroud)

不过,这不是最常见的形式.通常,在属性访问时会自动调用描述符,因为描述符的操作方法如下:

描述符可以通过其方法名称直接调用.例如,d.__get__(obj).

或者,更常见的是在属性访问时自动调用描述符.例如,在字典中obj.d查找.如果定义方法,则根据下面列出的优先规则调用.dobjd__get__()d.__get__(obj)