在Python语言参考,第3章Datamodel中,为什么"实例方法"列在"可调用类型"下,而"静态方法对象"和"类方法对象"列在"内部类型"下?
可调用类型这些类型可以应用函数调用操作(请参阅调用部分)...
实例方法......
内部类型解释器内部使用的一些类型向用户公开.他们的定义可能会随着解释器的未来版本而改变,但为了完整起见,这里提到了它们....
静态方法对象......
类方法对象......
静态和类方法对象不应该是可调用类型吗?
不,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)