cls关键字是否等效于类名



以下方法在类中总是等价的吗?换言之,在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不是关键字一样。

不,clsMyClass是不可互换的,除非你确信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

最新更新