python:为什么使用classmethod而不是staticmethod?

本问题已经有最佳答案,请猛点这里访问。

我知道它们是干什么的,而且我已经看到了许多这两种方法的例子,但是我还没有找到一个必须使用classmethod而不是用staticmethod替换它的例子。

我见过的最常见的classmethod示例是用于创建类本身的新实例,如下所示(非常简单的示例,没有使用atm方法)。但你懂的):

1
2
3
4
class Foo:
    @classmethod
    def create_new(cls):
        return cls()

这将在调用foo = Foo.create_new()时返回一个新的Foo实例。为什么我不能用这个来代替:

1
2
3
4
class Foo:
    @staticmethod
    def create_new():
        return Foo()

它的作用是一样的,为什么我要在staticmethod上使用classmethod呢?


在您的示例中没有什么不同,但是假设您创建了一个Foo的子类,并在子类上调用了create_new方法……

1
2
3
4
class Bar(Foo):
    pass

obj = Bar.create_new()

…然后这个基类将创建一个新的Bar对象…

1
2
3
4
class Foo:
    @classmethod
    def create_new(cls):
        return cls()

…而这个基类会创建一个新的Foo对象…

1
2
3
4
class Foo:
    @staticmethod
    def create_new():
        return Foo()

…所以选择取决于你想要的行为。


是的,这两个类也是一样的。

然而,现在想象一个类的子类型:

1
2
class Bar (Foo):
    pass

现在调用Bar.create_new做了一些不同的事情。对于静态方法,您将得到Foo。对于类方法,您得到一个Bar

因此,重要的区别在于类方法获取作为参数传递的类型。


从文档中,类方法接收其类作为隐式参数,而静态方法不知道它们所在的类。

当您想要用子类中的不同行为覆盖继承的静态方法时,这将非常有用。