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)
......所以选择取决于你想要的行为.
是的,这两个类会做同样的事情.
但是,现在想象一下该类的子类型:
class Bar (Foo):
pass
Run Code Online (Sandbox Code Playgroud)
现在呼叫Bar.create_new做了不同的事情.对于静态方法,你得到一个Foo.对于类方法,你得到一个Bar.
所以重要的区别是类方法获取作为参数传递的类型.