基于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 类是一个基类,它确保所有继承自它的类都是单例的。

相关推荐
CryptoRzz6 分钟前
如何高效对接美股实时行情?StockTV API 实战集成指南
java·python·flask·区块链·maven·symfony
Jackson@ML7 分钟前
2026最新版Python 3.14.2安装使用指南
开发语言·python
飞Link11 分钟前
指令调整阶段中的通用模型蒸馏、模型自我提升和数据扩充
python·算法·数据挖掘
qunaa010112 分钟前
轮胎识别号码检测▸基于YOLO11-ContextGuideFPN的高精度检测模型实现与部署
python
Channing Lewis13 分钟前
正则灾难性回溯(catastrophic backtracking)
开发语言·python
weixin_462446231 小时前
Python用Flask后端解析Excel图表,Vue3+ECharts前端动态还原(附全套代码)
前端·python·flask·echats
偷星星的贼111 小时前
如何为开源Python项目做贡献?
jvm·数据库·python
秋刀鱼程序编程1 小时前
Java基础入门(七)---异常处理
java·开发语言·python
二十雨辰1 小时前
[python]-基础语法
python