本问题已经有最佳答案,请猛点这里访问。
我知道它们是干什么的,而且我已经看到了许多这两种方法的例子,但是我还没有找到一个必须使用
我见过的最常见的
1 2 3 4 | class Foo: @classmethod def create_new(cls): return cls() |
这将在调用
1 2 3 4 | class Foo: @staticmethod def create_new(): return Foo() |
它的作用是一样的,为什么我要在
在您的示例中没有什么不同,但是假设您创建了一个
1 2 3 4 | class Bar(Foo): pass obj = Bar.create_new() |
…然后这个基类将创建一个新的
1 2 3 4 | class Foo: @classmethod def create_new(cls): return cls() |
…而这个基类会创建一个新的
1 2 3 4 | class Foo: @staticmethod def create_new(): return Foo() |
…所以选择取决于你想要的行为。
是的,这两个类也是一样的。
然而,现在想象一个类的子类型:
1 2 | class Bar (Foo): pass |
现在调用
因此,重要的区别在于类方法获取作为参数传递的类型。
从文档中,类方法接收其类作为隐式参数,而静态方法不知道它们所在的类。
当您想要用子类中的不同行为覆盖继承的静态方法时,这将非常有用。