【发布时间】:2016-11-16 19:50:06
【问题描述】:
为什么python的实例方法可以调用,而静态方法和类方法却不能调用?
我做了以下事情:
class Test():
class_var = 42
@classmethod
def class_method(cls):
pass
@staticmethod
def static_method():
pass
def instance_method(self):
pass
for attr, val in vars(Test).items():
if not attr.startswith("__"):
print (attr, "is %s callable" % ("" if callable(val) else "NOT"))
结果是:
static_method is NOT callable
instance_method is callable
class_method is NOT callable
class_var is NOT callable
从技术上讲,这可能是因为实例方法对象可能具有(未)以特定方式设置的特定属性(可能是__call__)。为什么会出现这种不对称,或者它有什么作用?
我在学习python检查工具时遇到了这个。
来自 cmets 的补充说明:
cmets 中链接的 SO 答案说静态/类方法是 descriptors ,这是不可调用的。现在我很好奇,为什么描述符是不可调用的,因为描述符是具有特定属性(__get__、__set__、__del___ 之一)定义的类。
【问题讨论】:
-
@MK。链接的答案说静态/类方法是描述符,因此它们不可调用。为什么描述符不能被调用?
-
您指向的 SO 答案实际上声称他们“使用”描述符。但根据定义,它们确实是描述符本身(实现
__get__)。 -
是什么让您认为描述符“是类”?你是说描述符是一个类对象,还是某个类的实例?