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

请问以下Python实现的Singleton(单例)模式代码的运行原理是什么?

单例模式实现逻辑详解

你提供的是Python中通过继承基类实现的单例模式,核心是重写魔法方法__new__控制实例创建流程,实现原理拆解如下:

核心代码回顾

class Singleton(object):
  _instances = {}
  def __new__(class_, *args, **kwargs):
    if class_ not in class_._instances:
        class_._instances[class_] = super(Singleton, class_).__new__(class_, *args, **kwargs)
    return class_._instances[class_]

class Context(Singleton):
    # 自定义业务逻辑
    pass

逐部分逻辑说明

  • 类属性_instances = {}:这是Singleton基类的全局类级字典,作用是存储所有继承自Singleton的子类对应的唯一实例,键为子类类对象,值为子类的实例对象,所有子类共享这个存储字典。
  • 魔法方法__new__:Python中实例化类时,__new__是负责创建类实例并返回的内置魔法方法,执行优先级高于负责实例属性初始化的__init__方法。
    • 参数class_:指当前正在实例化的类,如果你执行Context(),这里的class_就是Context类本身。
    • 实例判断逻辑:首先检查当前要实例化的类是否已经存在于_instances字典中:
      • 不存在:调用父类object的__new__方法创建一个当前类的实例,存入_instances字典后返回。
      • 已存在:直接返回字典中存储的已创建好的实例,不会重复创建。

运行效果验证

你可以通过以下代码测试效果:

c1 = Context()
c2 = Context()
# 两个变量指向同一个内存地址,说明是同一个实例
print(c1 is c2) # 输出为True

实现特点

  • 多子类兼容:支持多个子类同时继承Singleton基类,每个子类都会单独存储自己的唯一实例,不同子类的实例互不干扰。
  • 注意事项:当前实现未做并发控制,多线程场景下如果多个线程同时首次实例化同一个类,可能会出现创建多个实例的问题,多线程生产环境使用需要额外加互斥锁优化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:36:04