假设我有一个类,并且想要实现一个创建该类实例的方法。我有两个选择:
- 静态方法,
- 类方法。
一个例子:
class DummyClass:
def __init__(self, json):
self.dict = json
@staticmethod
def from_json_static(json):
return DummyClass(json)
@classmethod
def from_json_class(cls, json):
return cls(json)
这两种方法都有效:
dummy_dict = {"dummy_var": 124}
dummy_instance = DummyClass({"test": "abc"})
dummy_instance_from_static = dummy_instance.from_json_static(dummy_dict)
print(dummy_instance_from_static.dict)
> {'dummy_var': 124}
dummy_instance_from_class = DummyClass.from_json_class(dummy_dict)
print(dummy_instance_from_class.dict)
> {'dummy_var': 124}
我经常在别人的代码中看到的是classmethod
设计,而不是staticmethod
。为什么会这样?
或者,重新表述问题以获得更全面的答案:在 Python 中通过 classmethod
与 staticmethod
创建类实例的优缺点是什么?
最佳答案
@classmethod
方法的两大优点:
首先,您不需要对名称进行硬编码。考虑到 IDE 中的现代重构工具,这并不是什么大问题,但如果将 Foo
类的名称更改为 Bar<,那么代码不会中断,这很好。/
::
class Bar:
@statmicmethod
def make_me():
return Foo()
另一个优点(至少,您应该理解其中的区别!)是继承的行为方式:
class Foo:
@classmethod
def make_me_cm(cls):
return cls()
@staticmethod
def make_me_sm():
return Foo()
class Bar(Foo):
pass
print(Bar.make_me_cm()) # it's a Bar instance
print(Bar.make_me_sm()) # it's a Foo instance
关于Python:通过静态方法与类方法创建类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75379715/