我知道他们做了什么,我已经看到了很多这两个例子,但我没有找到一个例子,我必须使用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
?
答案 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开始,类方法接收其类作为隐式参数,而静态方法不知道它们所在的类。
在您希望使用子类中的不同行为覆盖的继承静态方法的情况下,这可能很有用。