Python实现单例模式的四种方式详解
本文详细解析Python中实现单例模式的四种常用方式:通过导入模块、使用装饰器、继承类以及重写__new__方法。每种方法均提供源码示例与运行结果分析,帮助开发者根据实际场景选择最合适的单例实现方案,确保类仅有一个实例并提供全局访问点。
单例模式简介
单例模式的核心目标是确保一个类在整个应用程序生命周期中仅存在一个实例,并提供一个全局访问入口。该模式适用于那些只需要单一实例且需要从统一入口访问的场景,例如数据库连接池、消息队列(MQ)管理等资源密集型对象。
Python单例模式的四种实现方式
在Python中,实现单例模式主要有以下四种常见方式:
方式一:通过导入模块实现
第一种方式是利用Python模块的特性。由于Python模块在导入时只执行一次,因此可以将单例实例作为模块级别的变量定义,直接通过导入模块来获取该实例。
方式二:通过装饰器实现
第二种方式是通过装饰器实现。利用装饰器在类定义时创建一个字典来缓存类的实例,每次调用类时先检查字典中是否已存在该类的实例,若不存在则创建并缓存,若存在则直接返回,从而实现单例逻辑。
方式三:通过使用类实现
第三种方式是通过自定义类来实现。在类内部维护一个类变量来存储实例,并在__init__方法中通过标志位控制是否重新初始化,确保多次实例化时返回的是同一个对象引用。
方式四:通过__new__方法实现
第四种方式是通过重写__new__方法实现。__new__是Python中负责创建实例的方法,通过在此方法中判断类是否已存在实例变量,若不存在则调用父类__new__创建新实例并赋值给类变量,后续调用直接返回该实例,这是最经典且常用的单例实现方式。
以下是第一种方式(通过导入模块)的完整源码示例,文件名为singleton.py。
模块方式源码示例
# -*- coding: utf-8 -*-
# time: 2022/5/17 10:31
# file: singleton.py
# author: tom
# 公众号: 玩转测试开发
class Singleton(object):
def __init__(self, name):
self.name = name
def run(self):
print(self.name)
s = Singleton("Tom")
主函数测试代码
主函数用于测试上述四种方式,文件名为test_singleton.py,主要包含对模块导入方式的调用演示。
完整测试源码
# -*- coding: utf-8 -*-
# time: 2022/5/17 10:51
# file: test_singleton.py
# author: tom
# 公众号: 玩转测试开发
from singleton import s as s1
from singleton import s as s2
# Method One:通过导入模块实现
def show_method_one():
"""
:return:
"""
print(s1)
print(s2)
print(id(s1))
print(id(s2))
show_method_one()
# Method Two:通过装饰器实现
def singleton(cls):
# 创建一个字典用来保存类的实例对象
_instance = {}
def _singleton(*args, **kwargs):
# 先判断这个类有没有对象
if cls not in _instance:
_instance[cls] = cls(*args, **kwargs) # 创建一个对象,并保存到字典当中
# 将实例对象返回
return _instance[cls]
return _singleton
@singleton
class Demo2(object):
a = 1
def __init__(self, x=0):
self.x = x
a1 = Demo2(1)
a2 = Demo2(2)
print(id(a1))
print(id(a2))
# Method Three:通过使用类实现
class Demo3(object):
# 静态变量
_instance = None
_flag = False
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self):
if not Demo3._flag:
Demo3._flag = True
b1 = Demo3()
b2 = Demo3()
print(id(b1))
print(id(b2))
# Method Four:通过__new__ 方法实现
class Demo4:
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Demo4, cls).__new__(cls)
return cls._instance
c1 = Demo4()
c2 = Demo4()
print(id(c1))
print(id(c2))
运行结果分析
运行上述代码后,控制台将输出各方式生成的实例ID,验证不同实现方式下实例的唯一性。

至此,关于Python实现单例模式的四种方式详解已完成。如需了解更多Python设计模式相关内容,建议查阅本站往期文章或继续关注后续更新,感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









