为什么使用classmethod而不是staticmethod?

时间:2013-04-23 14:36:47

标签: python class python-3.x static-methods class-method

我知道他们做了什么,我已经看到了很多这两个例子,但我没有找到一个例子,我必须使用classmethod而不是用staticmethod替换它。

我见过的classmethod最常见的例子是用于创建类本身的新实例,就像这样(非常简化的示例,没有使用方法atm。但你明白了这个想法:

class Foo:
    @classmethod
    def create_new(cls):
        return cls()

这会在调用Foo时返回foo = Foo.create_new()的新实例。 现在为什么我不能只使用它:

class Foo:
    @staticmethod
    def create_new():
        return Foo()

它完全相同,为什么我应该classmethod使用staticmethod

3 个答案:

答案 0 :(得分:24)

您的示例没什么区别,但假设您创建了Foo的子类并在子类上调用了create_new方法...

class Bar(Foo):
    pass

obj = Bar.create_new()

...然后这个基类会导致创建一个新的Bar对象......

class Foo:
    @classmethod
    def create_new(cls):
        return cls()

...而这个基类会导致创建一个新的Foo对象......

class Foo:
    @staticmethod
    def create_new():
        return Foo()

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

答案 1 :(得分:5)

是的,这两个类也会这样做。

但是,现在想象一下该类的子类型:

class Bar (Foo):
    pass

现在调用Bar.create_new会有所不同。对于静态方法,您将获得Foo。对于类方法,您将获得Bar

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

答案 2 :(得分:4)

docs开始,类方法接收其类作为隐式参数,而静态方法不知道它们所在的类。

在您希望使用子类中的不同行为覆盖的继承静态方法的情况下,这可能很有用。