31

我知道他们做了什么,并且我已经看到了很多这两个例子,但是我还没有找到一个我必须使用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()

它完全一样,我为什么要使用 a classmethodover a staticmethod

4

3 回答 3

29

您的示例几乎没有什么区别,但是假设您创建了一个子类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()

...所以选择将取决于您想要哪种行为。

于 2013-04-23T14:41:30.800 回答
7

是的,这两个类会做同样的事情。

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

class Bar (Foo):
    pass

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

所以重要的区别是类方法获取作为参数传递的类型。

于 2013-04-23T14:43:53.733 回答
4

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

这在您有一个继承的静态方法想要用子类中的不同行为覆盖的情况下很有用。

于 2013-04-23T14:44:26.757 回答