Python:通过静态方法与类方法创建类实例

标签 python oop static-methods class-method

假设我有一个类,并且想要实现一个创建该类实例的方法。我有两个选择:

  1. 静态方法,
  2. 类方法。

一个例子:

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 中通过 classmethodstaticmethod 创建类实例的优缺点是什么?

最佳答案

@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/

相关文章:

php - 注册表模式和注册对象的惰性实例化

c++ - 不能在 c++ 类实现文件 (.cpp) 中的静态方法上使用 "static"关键字

java - 包装类提供的静态方法是否经常使用?

python - SQLAlchemy - 某些表类的 ModuleMarker 错误

python - 将 javadoc 用于 Python 文档

c++ - 当函数调用退出并且函数在堆中生成类实例时,是否调用了析构函数?

java - 从android中的类获取静态值

c# - 如何在静态 web 方法中写入 cookie

python - 为什么从类实例返回的字符串保持 NoneType 类型,即使 IDLE 说它是一个字符串?

python - 调试简单的 Python 价格代码