You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何避免在构造函数间传递单例类实例?

Python 单实例对象的全局访问方案

问题背景

现有多个Python类,示例定义如下:

class A(SomeBaseClass):
    def __init__(self):
        super().__init__()
        self._attribute_0 = something_0
        self._attribute_1 = something_1
        # 其他初始化逻辑

    def some_method(self) -> None:
        do_something()

类似的还有B、C、D等类,它们并非全部继承自同一基类,每个类功能独立且封装合理,核心特点是每个类仅存在一个实例。

当前的使用方式是在主函数中手动创建实例并传递依赖:

if __name__ == "__main__":
    a = A()
    b = B(a)
    c = C()
    d = D(c, a)
    b.d = d
    # 更多实例依赖赋值

这种方式在多实例场景下合理,但由于实际仅需单实例,构造函数传参和手动赋值显得冗余,且类名复杂时主函数可读性极差。

我们的目标是让a、b、c等实例能在整个项目中直接访问,无需通过构造函数传参或逐个赋值,同时避免使用争议较大的单例模式。

可选方案

全局实例模块方案(@blue_note 提出)

可以单独创建一个模块来集中初始化所有单实例对象,其他模块直接导入使用:

  1. 创建objects.py模块,统一初始化所有实例并处理依赖:
# objects.py
a = A()
b = B(a)
c = C()
d = D(c, a)
b.d = d
  1. 在项目其他文件中直接导入所需实例使用:
# foo.py
from objects import a

class Foo:
    def __init__(self):
        # 直接使用全局实例a
        a.some_method()

该方案的优势:

  • 实例初始化逻辑集中管理,便于后续维护和调整依赖关系
  • 其他模块无需关心实例创建细节,直接导入即可使用
  • 相比传统单例模式,更易进行测试(测试时可直接替换模块中的实例)

内容的提问来源于stack exchange,提问作者mxwQuestion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:05:33