是的,你的猜测会奏效。请注意,在类外部调用staticmethods和classmethods也是可能的/正常的:
class A():
...
A.class_foo()
A.static_foo()另请注意,在常规实例方法中,习惯上直接在实例(self)而不是类(A)上调用staticmethods和类方法:
class A():
def instance_method(self):
self.class_foo()
self.static_foo()这允许继承工作,因为你可能期望 - 如果我创建一个A子B,如果我叫B.instance_method(),我class_foo功能将得到B而不是A作为cls参数 - 可能,如果我在B覆盖static_foo要做一些与A.static_foo略有不同的事情,这将允许调用被覆盖的版本。
一些例子可能会使这更清楚:
class A(object):
@staticmethod
def static():
print("Static, in A")
@staticmethod
def staticoverride():
print("Static, in A, overrideable")
@classmethod
def clsmethod(cls):
print("class, in A", cls)
@classmethod
def clsmethodoverrideable(cls):
print("class, in A, overridable", cls)
def instance_method(self):
self.static()
self.staticoverride()
self.clsmethod()
self.clsmethodoverride()
class B(A):
@classmethod
def clsmethodoverrideable(cls):
print("class, in B, overridable", cls)
@staticmethod
def staticoverride():
print("Static, in B, overrideable")
a = A()
b = B()
a.instance_method()
b.instance_method()...
运行之后,通过在instance_method中将所有self.更改为A.来尝试它。重新运行并进行比较。您会看到所有对B的引用都已消失(即使您正在调用b.instance_method())。这就是您想要使用self而不是类的原因。