基于Python实现单例模式

目录

1、使用装饰器实现

2、使用__new__方法实现

单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。这种模式在多种场景中都非常有用,以下是单例模式的一些常见应用场景:

  1. 应用程序的日志应用:日志记录通常需要一个全局共享的日志对象,以便于追加日志内容。使用单例模式可以确保在整个应用程序中只有一个日志对象实例。
  2. 数据库连接池:数据库连接是昂贵的资源,频繁地创建和销毁连接会导致性能问题。通过单例模式,可以确保数据库连接池只有一个实例,从而有效地管理和复用数据库连接。
  3. 多线程的线程池:线程池用于管理和复用线程,以避免频繁地创建和销毁线程。使用单例模式可以确保线程池只有一个实例,从而方便地对池中的线程进行控制和管理。
  4. 全局配置对象:在Web应用中,配置对象通常是共享的,需要确保在整个应用程序中只有一个实例。使用单例模式可以方便地读取和更新全局配置对象。

1、使用装饰器实现

python 复制代码
def singleton(cls):
    instances = {}
    
    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return get_instance

@singleton
class MyClass:
    def __init__(self, val):
        self.val = val


# 使用
a = MyClass(1)
b = MyClass(2)
print(a is b)  # 输出:True

2、使用__new__方法实现

通过重写类的 __new__ 方法,可以控制实例的创建。

python 复制代码
class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance


class MyClass(Singleton):
    def __init__(self, val):
        self.val = val


# 使用
a = MyClass(1)
b = MyClass(2)
print(a is b)  # 输出:True

在这个例子中,Singleton 类是一个基类,它确保所有继承自它的类都是单例的。

相关推荐
三块可乐两块冰2 分钟前
【机器学习笔记三十二】机器学习三十二
python
love530love11 分钟前
ComfyUI-3D-Pack:Windows 下手动编译 mesh_inpaint_processor C++ 加速模块
c++·人工智能·windows·python·3d·hunyuan3d·comfyui-3d-pack
vx_biyesheji000121 分钟前
计算机毕业设计:Python多源新闻数据智能舆情挖掘平台 Flask框架 爬虫 SnowNLP ARIMA 可视化 数据分析 大数据(建议收藏)✅
爬虫·python·机器学习·数据分析·django·flask·课程设计
m0_5879589523 分钟前
机器学习与人工智能
jvm·数据库·python
2501_9083298526 分钟前
Python入门:从零到一的第一个程序
jvm·数据库·python
紫丁香36 分钟前
Selenium自动化测试详解1
python·selenium·测试工具·ui
Liu6288837 分钟前
Web开发与API
jvm·数据库·python
观书喜夜长38 分钟前
大模型应用开发学习-基于langchain框架做一个个人文档问答助手
python·学习·idea
m0_7434703740 分钟前
Python字典与集合:高效数据管理的艺术
jvm·数据库·python
2501_9454235441 分钟前
使用Scrapy框架构建分布式爬虫
jvm·数据库·python