名称“ staticmethod”和“ classmethod”听起来像它们应该可以被某个类调用而无需实例。另一方面,在类中定义的不是类方法或静态方法的方法在直观上听起来像它们应该是只能为实例调用的方法。
但是,似乎与直觉相反的事实是:与类中的方法定义处于同一级别的代码不能调用staticmethod或classmethod函数,但是可以调用“ instance”方法。例如:
class C1:
def f1(*args):
return "x"
a1 = f1() # works
@staticmethod
def f2(*args):
return "y"
a2 = f2() # does NOT work
@classmethod
def f3(*args):
return "z"
a3 = f3() # does NOT work
我不太了解其背后的原因。
一个人会假设,在顶级中定义的任何内容都是该类本身的一部分,而后面的内容可以利用之前的内容。可以假设一旦执行了所有顶层代码,这就是类“ C1”所知道的,并且所有实例都将继承该内容。
但显然并非如此。到底是什么情况,更重要的是,为什么决定不执行本来可以做到的直观方式呢?
问题'staticmethod' object is not callable暗示,静态方法(和类方法)不能在类的主体内访问,而可以使用例如f2.__func__()
我的问题不是关于它如何工作的这一方面,而是为什么它如此工作,这意味着在主体中使用方法与给定实例方法,类方法和语义的情况相反。静态方法。 换句话说:为什么这个设计决定有意义?