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

相关推荐
MATLAB代码顾问24 分钟前
Python实现蜂群算法优化TSP问题
开发语言·python·算法
yaodong51836 分钟前
不会Python也能数据分析:Gemini 3.1 Pro解决办公问题的SQL自动生成
python·sql·数据分析
BU摆烂会噶1 小时前
【LangGraph】持久化实现的三大能力——时间旅行
数据库·人工智能·python·postgresql·langchain
消失的旧时光-19432 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
zhaoyong2223 小时前
MySQL 存储过程中字符集与排序规则不匹配导致查询性能下降的解决方案
jvm·数据库·python
sinat_383437363 小时前
golang如何从Python转型Go开发_golang从Python转型Go开发攻略
jvm·数据库·python
rockey6274 小时前
基于AScript的python3脚本语言发布啦!
python·c#·.net·script·python3·eval·expression·function·动态脚本
gqk014 小时前
Python入门
python
Muyuan19984 小时前
28.Paper RAG Agent 开发记录:修复 LLM Rerank 的解析、Fallback 与可验证性
linux·人工智能·windows·python·django·fastapi
代码小书生4 小时前
statistics,一个统计的 Python 库!
开发语言·python