为什么使用classmethod而不是staticmethod?

Pat*_*oki 26 python static-methods class class-method python-3.x

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

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

class Foo:
    @classmethod
    def create_new(cls):
        return cls()
Run Code Online (Sandbox Code Playgroud)

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

class Foo:
    @staticmethod
    def create_new():
        return Foo()
Run Code Online (Sandbox Code Playgroud)

它完全相同,我为什么要使用classmethoda staticmethod

Aya*_*Aya 24

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

class Bar(Foo):
    pass

obj = Bar.create_new()
Run Code Online (Sandbox Code Playgroud)

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

class Foo:
    @classmethod
    def create_new(cls):
        return cls()
Run Code Online (Sandbox Code Playgroud)

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

class Foo:
    @staticmethod
    def create_new():
        return Foo()
Run Code Online (Sandbox Code Playgroud)

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


pok*_*oke 5

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

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

class Bar (Foo):
    pass
Run Code Online (Sandbox Code Playgroud)

现在呼叫Bar.create_new做了不同的事情.对于静态方法,你得到一个Foo.对于类方法,你得到一个Bar.

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