请问以下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
相关产品推荐
相关产品推荐

