以下方法在类中总是等价的吗?换言之,在MyClass
中,我可以在类方法中互换使用cls
,在静态方法中可互换使用MyClass
吗?
class MyClass:
@classmethod
def my_class_method(cls):
cls.attribute = "a"
@staticmethod
def my_non_class_method():
MyClass.attribute = "b"
cls
不是关键字,就像self
不是关键字一样。
不,cls
和MyClass
是不可互换的,除非你确信MyClass
没有任何子类。
如果通过子类调用@classmethod
,那么它的目的就是获得正确的类类型。例如
class Base:
@classmethod
def f(cls):
print(f'class is {cls}')
class Sub(Base):
pass
Sub.f() # calls Base.f with cls=Sub
如果不需要实际的类类型,那么可以使用@staticmethod
。
是。见鬼,如果你真的喜欢的话,你也可以在类方法中使用MyClass